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 }

 

posted @ 2018-08-04 16:44  Piccolo_Devil  阅读(174)  评论(0编辑  收藏  举报