和 食物链 这一题类似, 都是运用并查集来判断是否在不同的集合, 关键在于对关系的判断
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 1e5+5;
int par[maxn*2], rak[maxn*2], N, M;;
void init(int n){
for(int i = 1; i <= n; i++)
par[i] = i, rak[i] = 0;
}
int findr(int a){
if(par[a]==a) return a;
else return par[a] = findr(par[a]);
}
void unite(int a, int b){
a = findr(a), b = findr(b);
if(a==b) return;
if(rak[a] < rak[b])
par[a] = b;
else{
par[b] = a;
if(rak[a]==rak[b])
rak[a]++;
}
}
bool isSame(int a, int b){return findr(a)==findr(b);}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&M);
init(N*2);
char opt; int a, b;
for(int i = 1; i <= M; i++){
scanf("\n%c%d%d",&opt,&a,&b);
if(opt=='D'){
unite(a, b+N), unite(a+N, b);
}
else{
if(isSame(a,b+N) || isSame(a+N,b))
printf("In different gangs.\n");
else if(isSame(a, b) || isSame(a+N, b+N))
printf("In the same gang.\n");
else
printf("Not sure yet.\n");
}
}
}
return 0;//
}