POJ-1703 Find them, Catch them---并查集

题目链接:

https://vjudge.net/problem/POJ-1703

题目大意:

题目大意:在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙
输入D x y代表x于y不在一个团伙里
输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙里

思路:

POJ-1182类似

对每个人设置两个元素,i-A,i-B,其中i-x表示i属于团伙x

如果x和y不在一个团伙里面,那么合并x和y+n,合并x+n和y,这样就可以直接判断出xy的关系了,如果在查询的时候x和y在同一组,那么可以直接查询到他们已经合并在一起,如果x和y在不同的组,就可以查询到x和y+n在同一组,y和x+n在同一组,这就表示x和y不在同一组。如果不是上述情况那就是不能确定。

 1 #include<iostream>
 2 #include<vector>
 3 #include<queue>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<cstdio>
 7 #include<set>
 8 #include<map>
 9 #include<cmath>
10 using namespace std;
11 typedef pair<int, int> Pair;
12 typedef long long ll;
13 const int INF = 0x3f3f3f3f;
14 int T, n, m, d;
15 const int maxn = 1e6 + 10;
16 int pa[maxn];
17 
18 int Find(int x)
19 {
20     return x == pa[x] ? x : pa[x] = Find(pa[x]);
21 }
22 void unite(int x, int y)
23 {
24     x = Find(x);
25     y = Find(y);
26     pa[x] = y;
27 }
28 int main()
29 {
30     scanf("%d", &T);
31     getchar();
32     while(T--)
33     {
34         scanf("%d%d", &n, &m);
35         getchar();
36         char c;
37         int a, b;
38         for(int i = 0; i <= 2 * n; i++)pa[i] = i;//这里初始化2*n个元素
39         int a1, a2, b1, b2;
40         while(m--)
41         {
42             scanf("%c %d %d", &c, &a, &b);
43             getchar();
44             if(c == 'A')
45             {
46                 a1 = Find(a);
47                 b1 = Find(b), b2 = Find(b + n);
48                 if(a1 == b1)
49                     printf("In the same gang.
");
50                 else if(a1 == b2)
51                     printf("In different gangs.
");
52                 else printf("Not sure yet.
");
53             }
54             else if(c == 'D')
55             {
56                 unite(a, b + n);
57                 unite(b, a + n);
58             }
59         }
60     }
61 }
原文地址:https://www.cnblogs.com/fzl194/p/8819710.html