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
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 Output
FAIL
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; }