poj2236 - Wireless Network

                                想看更多的解題報告: http://blog.csdn.net/wangjian8006/article/details/7870410
                                  轉載請註明出處:http://blog.csdn.net/wangjian8006

題目大意:有n臺損壞的電腦,現在會逐漸修復電腦,給你所有電腦的座標,然後兩臺電腦能夠通信的標準是,距離不超過d或者能夠
通過已經修好的電腦到達另一臺電腦
對其進行兩種可能的操作,O x表示修復第x臺,S x y表示判斷x y之間能否通信
若能輸出SUCCESS,否則輸出FALL。

解題思路:兩臺電腦之間如果可以通信,那麼兩臺電腦都是已經維修過的,並且距離不超過d,用這個條件來使兩臺電腦所屬的集合合併,
這樣用並查集來判斷2臺電腦是否可以通信

/*
Memory 204K
Time 1141MS
*/
#include <stdio.h>
#include <math.h>
#define MAXV 1010

typedef struct{
	int x,y,flag;
}POINT;

int n;
double d;
POINT p[MAXV];
int sets[MAXV];

int find(int x){
	if(x == sets[x]) return x;
	int rt = find(sets[x]);
	return rt;
}

void Union(int x,int y){
	int fx = find(x);
	int fy = find(y);
	if(fx == fy) return ;
	sets[fy] = fx;
}

double dis(int a,int b){
	return (double)sqrt((p[a].x-p[b].x)*(p[a].x-p[b].x)+(p[a].y-p[b].y)*(p[a].y-p[b].y));
}

int main(){
	int i,a,b;
	char ch[5];
	scanf("%d %lf\n",&n,&d);
	for(i = 1;i <= n;i++){
		scanf("%d %d\n",&p[i].x,&p[i].y);
		sets[i] = i;
		p[i].flag = 0;
	}

	while(~scanf("%s",ch)){
		if(ch[0]=='O'){
			scanf("%d",&a);
			p[a].flag = 1;
			for(i = 1;i <= n;i++){
				if(i!=a && p[i].flag && dis(i,a) <= d){	//若剛修好的電腦與另一臺已經修好電腦的距離不超過d,那麼他們之間就可以通信
					Union(i,a);
				}
			}
		}else{
			scanf("%d %d",&a,&b);
			if(find(a)==find(b)) printf("SUCCESS\n");		//屬於同一個集合就可以通信
			else printf("FAIL\n");
		}
	}	
	return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章