这道题根同性恋那道题相当像无非就是看他有没有合并过、记录合并之后的那个点的关系罢了。

//AC代码1 #include <stdio.h> #include <stdlib.h> int set[100005],num[100006],h[100005]; int find(int x) { if(x!=set[x]) { int y = set[x]; set[x] = find(set[x]); num[x] = (num[x]+num[y])%2;//一定要写这个%2不知道为什么不加%2他就wa加上就ac我郁闷了好久,可能是会超限吧。。。 } return set[x]; } void merge(int x, int y) { int a = find(x); int b = find(y); if(a!= b) { if(h[a]>h[b]) { set[b] = a; num[b] = (num[x]-num[y]+1)%2;//别忘了加啊 } else { set[a] = b; num[a] = (num[y]-num[x]+1)%2; if(h[a] == h[b]) h[b]++; } } } int main() { int t; scanf("%d",&t); while(t--) { int i,n,m,a,b; char order[5]; scanf("%d %d",&n,&m); for(i = 0;i <= n;i++) { set[i] = i; h[i] = 0; num[i] = 0; } while(m--) { scanf("%s",order); scanf("%d %d",&a,&b); if(order[0] == 'D') merge(a,b); else { if(find(a) == find(b)) { if(num[a]%2 != num[b]%2) puts("In different gangs."); else puts("In the same gang."); } else puts("Not sure yet."); } } } }

#include <stdio.h> #include <stdlib.h> int set[100005],num[100006],h[100005]; int find(int x) { if(x!=set[x]) { int y = set[x]; set[x] = find(set[x]); num[x] = (num[x]+num[y])%2; } return set[x]; } void merge(int x, int y) { int a = find(x); int b = find(y); if(a!= b) { if(h[a]>h[b]) { set[b] = a; num[b] = (num[x]-num[y]+1)%2; } else { set[a] = b; num[a] = (num[y]-num[x]+1)%2; if(h[a] == h[b]) h[b]++; } } } int main() { int t; scanf("%d",&t); while(t--) { int i,n,m,a,b; char order[5]; scanf("%d %d",&n,&m); for(i = 0;i <= n;i++) { set[i] = i; h[i] = 0; num[i] = 0; } while(m--) { scanf("%s",order); scanf("%d %d",&a,&b); if(order[0] == 'D') merge(a,b); else { if(find(a) == find(b)) { if(num[a]%2 != num[b]%2) puts("In different gangs."); else puts("In the same gang."); } else puts("Not sure yet."); } } } }