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.\n"); 50 else if(a1 == b2) 51 printf("In different gangs.\n"); 52 else printf("Not sure yet.\n"); 53 } 54 else if(c == 'D') 55 { 56 unite(a, b + n); 57 unite(b, a + n); 58 } 59 } 60 } 61 }
越努力,越幸运