POJ 2236 Wireless Network
タイトルのソース:http://poj.org/problem?id=2236
Wireless Network
Time Limit: 10000 MS
メモリLimit: 65536 K
Total Submissions: 16470
Acceepted: 6942
Description
An earthquake Taes place in Southeast Asia.The ACM(AAAsiCooperateam)have set up a wireless netwotworkwith the lap coputters、but an unexpected aftershshaaatcked、all coputters the ininininininininininininaattttworerererererererererererettttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttthe hard ware resticts,each computter can only directly communicate with the computters that are not farther than d meters from it.Buteverry computer can be regarded as the intermediary of the communication between betwern compersthat is to say computer A and computer B can communicate if computer A and computter B can communicate directly or there is a computer C that can communicate with both A and B.
In the process of repairing the network,works can takers twork of operations at everation moment,repairing a computer,or testing if two computters can communicate.Your job is to answer the testing operation.
Input
The first line contains two integers N and(1<=N==1001,0、<=d==20000).Here N is the number of computters,which ared from 1 to N,and D is the maximdistance two tcomputter can comprectine.inititinine.initinine。which is the coordinate of N computters.From the(N+1)-th line to the end of input,there are operations,which are carried out one byone.Each line contains an operation in one of follwing two formas:
1.「O p」(1<=p<=N)、which means repairing coputer p.
2.「S p q」(1<=p,q<=N)、which means testing whether computer p and q can communicate.
The input will not exceed 30000 lines.
Output
For each Testing operation、print「SUCCESS」if the two computters can communicate、or「FAIL」if not.
Sample Input
簡単で、調べてみます。
ACコード:
Wireless Network
Time Limit: 10000 MS
メモリLimit: 65536 K
Total Submissions: 16470
Acceepted: 6942
Description
An earthquake Taes place in Southeast Asia.The ACM(AAAsiCooperateam)have set up a wireless netwotworkwith the lap coputters、but an unexpected aftershshaaatcked、all coputters the ininininininininininininaattttworerererererererererererettttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttthe hard ware resticts,each computter can only directly communicate with the computters that are not farther than d meters from it.Buteverry computer can be regarded as the intermediary of the communication between betwern compersthat is to say computer A and computer B can communicate if computer A and computter B can communicate directly or there is a computer C that can communicate with both A and B.
In the process of repairing the network,works can takers twork of operations at everation moment,repairing a computer,or testing if two computters can communicate.Your job is to answer the testing operation.
Input
The first line contains two integers N and(1<=N==1001,0、<=d==20000).Here N is the number of computters,which ared from 1 to N,and D is the maximdistance two tcomputter can comprectine.inititinine.initinine。which is the coordinate of N computters.From the(N+1)-th line to the end of input,there are operations,which are carried out one byone.Each line contains an operation in one of follwing two formas:
1.「O p」(1<=p<=N)、which means repairing coputer p.
2.「S p q」(1<=p,q<=N)、which means testing whether computer p and q can communicate.
The input will not exceed 30000 lines.
Output
For each Testing operation、print「SUCCESS」if the two computters can communicate、or「FAIL」if not.
Sample Input
4 1
0 1
0 2
0 3
0 4
O 1
O 2
O 4
S 1 4
O 3
S 1 4
Sample OutputFAIL
SUCCESS
ソurce簡単で、調べてみます。
ACコード:
#include<cstdio>
#include<cmath>
const int Max=1002;
struct Node{
double x,y;int loc;
}father[Max];
int set[Max],pos=0,n,dx,dy;
char ch; double d;
bool dis(int x,int k){
double di=sqrt(pow(father[x].x-father[k].x,2)+pow(father[x].y-father[k].y,2));
if(di<=d) return true;
return false;
}
int find(int k){
if(k==father[k].loc) return k;
int temp=find(father[k].loc);
father[k].loc=temp;
return temp;
// return find(father[k].loc);
}
int main(){
scanf("%d%lf",&n,&d);
for(int i=1;i<=n;i++){
scanf("%lf%lf",&father[i].x,&father[i].y);
father[i].loc=i;
}
while(getchar(),~scanf("%c",&ch)){
if(ch=='O'){
scanf("%d",&dx);
for(int i=0;i<pos;i++){
if(dis(dx,set[i])){
int tempx=find(set[i]);
father[tempx].loc=find(dx);
}
}
set[pos++]=dx;
}
else {
scanf("%d%d",&dx,&dy);
int tempx=find(dx),tempy=find(dy);
if(tempx==tempy) printf("SUCCESS
");
else printf("FAIL
");
}
}
return 0;
}