想看更多的解题报告: http://iyenn.com/rec/1824570.html
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:有n台损坏的电脑,现在会逐渐修复电脑,给你所有电脑的坐标,然后两台电脑能够通信的标准是,距离不超过d或者能够
通过已经修好的电脑到达另一台电脑
对其进行两种可能的操作,O x表示修复第x台,S x y表示判断x y之间能否通信
若能输出SUCCESS,否则输出FALL。
解题思路:两台电脑之间如果可以通信,那么两台电脑都是已经维修过的,并且距离不超过d,用这个条件来使两台电脑所属的集合合并,
这样用并查集来判断2台电脑是否可以通信
- /*
- Memory 204K
- Time 1141MS
- */
- #include
- #include
- #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;
- }
评论记录:
回复评论: