poj 2236 并查集 计算机网络
2012-02-29 22:16
363 查看
题意:给出N,d代表有N个计算机,还有可以建立连接的限制距离d。O 后面的数字代表了维修好的计算机,S 后面的两个数字用来判断,这两个计算机是否建立的连接。
思路:并查集,每修好一个计算机,进行标记,同时枚举所有计算机,在维修好的计算机中,找出可以建立连接的计算机,进行合并。
思路:并查集,每修好一个计算机,进行标记,同时枚举所有计算机,在维修好的计算机中,找出可以建立连接的计算机,进行合并。
#include<iostream> #include<cmath> using namespace std; struct point { int x; int y; int parent; }p[1010]; bool vis[1010]; int N,d; double get_dis(int i,int j)//得到距离 { int x1,y1,x2,y2; x1=p[i].x;y1=p[i].y; x2=p[j].x;y2=p[j].y; return sqrt(double((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))); } void make_set() { for(int i=1;i<=N;i++) p[i].parent=i; } int find_set(int x) { if(x==p[x].parent) return x; else { p[x].parent=find_set(p[x].parent); } return p[x].parent; } void join(int x,int y) { int r1=find_set(x); int r2=find_set(y); if(r1!=r2) { p[r1].parent=r2; } } int main() { char s[2]; int g,a,b; scanf("%d%d",&N,&d); for(int i=1;i<=N;i++) { scanf("%d%d",&p[i].x,&p[i].y); vis[i]=0; } make_set(); //for(int i=1;i<=N;i++) //printf("%d,%d\n",p[i].x,p[i].y); while(scanf("%s",s)!=EOF) { if(s[0]=='O') { scanf("%d",&g); vis[g]=1; for(int i=1;i<=N;i++)//枚举所有计算机 { if(vis[i]&&i!=g)//对已经修好的计算机,判断是否可以建立连接 { //printf("%d %d %f\n",i,g,get_dis(g,i)); //system("pause"); if(get_dis(g,i)<=d) join(g,i); } } } else { scanf("%d%d",&a,&b); if(find_set(a)==find_set(b)) printf("SUCCESS\n"); else printf("FAIL\n"); } } }
相关文章推荐
- poj2236_并查集_Wireless Network
- POJ 2236 (简单并查集) Wireless Network
- poj 2236 Wireless Network (并查集)
- poj 2236 Wireless Network(并查集)
- poj 2236 Wireless Network(并查集)
- 《挑战程序设计竞赛》2.4.2 数据结构-并查集 POJ1182 2236 1703 AOJ2170
- POJ-2236 Wireless Network(并查集)
- Wireless Network(POJ - 2236)并查集
- POJ---2236-Wireless Network(并查集)
- POJ 2236 Wireless Network(并查集加判断)
- poj 2236 并查集水题
- POJ-2236 Wireless Network 并查集
- poj 2236 Wireless Network(并查集模板题)
- POJ 2236 Wireless Network (并查集)
- POJ 2236 Wireless Network(并查集)
- pku 2236 poj 并查集一般题
- POJ 2236 Wireless Network [并查集] 《挑战程序设计竞赛》2.4
- poj2236 并查集
- POJ-2236 Wireless Network 并查集
- POJ_2236_Wireless Network【并查集】