标签:
题目大意:
就是说,给你一个二维平面和n个点的坐标,让你求出有多少个点的坐标是联通的,联通的条件就是说,他们两者之间的距离小于等于1并且满足直接联通和间接联通。
如果联通的话,我们就输出SUCESS,否则就输出FAIL。
解题思路:
看到后,第一时间想到的就是并查集,其实用并查集维护起来是很容易的,我们只需要开一个rep[]数组,来维护每次修好的机器,然后判断这两点的距离是否小于等于d
如果小于等于d的话就把这两个点放到一个集合中去,然后,在进行S操作的时候,我们只需要判断输入的两个点的坐标是否在同一个集合中,如果在同一个集合中的话,我们
就输出SUCESS,否则就输出FAIL。
代码:
1 # include<cstdio> 2 # include<iostream> 3 4 using namespace std; 5 6 # define MAX 1004 7 8 int n, d; 9 struct node 10 { 11 int x; 12 int y; 13 }a[MAX]; 14 15 int f[MAX]; 16 int rep[MAX]; 17 18 int dis ( struct node A, struct node B ) 19 { 20 return ( A.x-B.x )*( A.x-B.x)+(A.y-B.y)*(A.y-B.y); 21 } 22 23 24 int getf( int v) 25 { 26 if ( f[v]==v ) 27 { 28 return v; 29 } 30 else 31 { 32 f[v] = getf(f[v]); 33 return f[v]; 34 } 35 } 36 37 38 void merge ( int v,int u ) 39 { 40 int t1 = getf(v); 41 int t2 = getf(u); 42 if ( t1!=t2 ) 43 { 44 f[t2] = t1; 45 } 46 } 47 48 49 50 int main(void) 51 { 52 53 while ( scanf("%d %d",&n,&d)!=EOF ) 54 { 55 for ( int i = 1;i <= n;i++ ) 56 { 57 scanf("%d %d",&a[i].x,&a[i].y); 58 } 59 for ( int i = 1;i <= n;i++ ) 60 { 61 f[i] = i; 62 } 63 64 int cnt = 0; 65 char ch; 66 while ( cin>>ch ) 67 { 68 if ( ch==‘O‘ ) 69 { 70 int t; 71 scanf("%d",&t); 72 for ( int i = 0;i < cnt;i++ ) 73 { 74 if ( dis ( a[t],a[rep[i]] ) <= d*d ) 75 { 76 merge( rep[i],t); 77 } 78 } 79 rep[cnt++] = t; 80 } 81 else 82 { 83 int x,y; 84 scanf("%d %d",&x,&y); 85 x = getf(x); 86 y = getf(y); 87 if ( x==y ) 88 printf("SUCCESS\n"); 89 else 90 printf("FAIL\n"); 91 92 } 93 } 94 } 95 96 return 0; 97 }
POJ 2236 Wireless Network(并查集)
标签:
原文地址:http://www.cnblogs.com/wikioibai/p/4438160.html