poj2236(并查集)
题目链接:http://poj.org/problem?id=2236
题意:
关于电脑之间的连接问题,给出一个距离限制,一台电脑与一台电脑是连接的有两种情况,一种是他们之间的距离小于限制距离,另一种是他们之间的距离超过了限制距离,但是他们间接通过其他在限制距离内的电脑互相连接。当然要连接的话首先要保证电脑是激活的状态,然后S表示询问,叫你判断询问的两台电脑之间是否连接。
思路:
简单的并查集做法,只是合并的时候加上判断条件,首先在距离内的才能直接连接,还有只有连接的两台电脑都处于激活状态。水~
代码:
1 #include<iostream> 2 #include<stdio.h> 3 #include<cmath> 4 using namespace std; 5 6 int fa[1010]; 7 int n, max_dis; 8 9 struct Num 10 { 11 int id; 12 int x; 13 int y; 14 int flag; //判断是否修复 15 } num[1010]; 16 17 int dis(Num a, Num b) //计算距离,返回的是距离的平方 18 { 19 return ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); 20 } 21 22 void init(int n) 23 { 24 for(int i = 1; i <= n; i++) 25 { 26 num[i].id = i; 27 fa[i] = i; 28 num[i].flag = 0; 29 } 30 return; 31 } 32 33 int find(int x) 34 { 35 return (fa[x] == x ? x : (fa[x] = find(fa[x]))); 36 } 37 38 void unite(Num a, Num b) 39 { 40 int r1 = find(a.id); 41 int r2 = find(b.id); 42 if(r1 == r2) 43 { 44 return; 45 } 46 else 47 { 48 if(dis(a, b) <= (max_dis * max_dis)) 49 { 50 fa[r2] = r1; 51 } 52 } 53 } 54 55 int main() 56 { 57 ios::sync_with_stdio(false); 58 while(cin >> n >> max_dis) 59 { 60 init(n); 61 for(int i = 1; i <= n; i++) 62 { 63 cin >> num[i].x >> num[i].y; 64 } 65 char ch; 66 int p, q; 67 //getchar(); 68 while(cin >> ch) 69 { 70 if(ch == 'O') //这里是大写字母O,不是0 71 { 72 cin >> p; 73 num[p].flag = 1; 74 for(int i = 1; i <= n; i++) 75 { 76 if(num[i].flag == 1 && i != p) 77 unite(num[p], num[i]); 78 } 79 } 80 else if(ch == 'S') 81 { 82 cin >> p >> q; 83 if(find(num[p].id) == find(num[q].id)) 84 { 85 cout << "SUCCESS" << endl; 86 } 87 else 88 { 89 cout << "FAIL" << endl; //最近有点不在状态啊,找了这么久的错误,才发现是FAIL写成了FALL…… 90 } 91 } 92 } 93 } 94 return 0; 95 }