POJ 2236

来源:互联网 发布:淘宝助理导出宝贝详情 编辑:程序博客网 时间:2024/06/14 05:32

并查集的应用。

#include<cstdio>#include<iostream>using namespace std;struct type{int x,y;//电脑的坐标bool state;//电脑是否已修复,已修复为1,未修复为0}c[1005];int par[1005],rank[1005],n,d;void init(int n){for(int i=1;i<=n;i++){par[i]=i,rank[i]=0;c[i].state=0;}}int find(int x){if(par[x] == x) return x;else return( par[x] = find(par[x]) );}void unite(int x,int y){x=find(x),y=find(y);if(x == y) return;if(rank[x] < rank[y]) par[x]=y;else{par[y]=x;if(rank[x] == rank[y]) rank[x]++;}}double dist2(type a,type b)//返回两台电脑的距离的平方{return( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) );}bool same(int x,int y){return( find(x) == find(y) );}int main(){char op;scanf("%d%d",&n,&d);init(n);//初始化n台电脑for(int i=1;i<=n;i++) scanf("%d%d",&c[i].x,&c[i].y);while(cin>>op){if(op == 'O'){int Num;scanf("%d",&Num);c[Num].state=1;for(int i=1;i<=n;i++)//遍历每台电脑,对于某台电脑c[i]……{if(i == Num) continue;if(c[i].state && dist2(c[i],c[Num]) <= d*d) unite(i,Num);//如果c[i]是已修复的,并且与当前修复这台电脑c[Num]距离小于d,就归入一组}}else if(op == 'S'){int test1,test2;scanf("%d%d",&test1,&test2);if(same(test1,test2)) printf("SUCCESS\n");//在同一组内,就可以成功通信else printf("FAIL\n");//否则就无法通信}}}




0 0
原创粉丝点击