并查集水题。。。敌对( a, b ) a 和 b+n建结合。。。反之也是。。最后判断 a+n b+n a b 之间关系就好了。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e5+5;
int pre[maxn*2];
inline void init(int n){for(int i=1;i<=n;i++)pre[i]=i;}
inline int find(int x){return pre[x]==x ? x:pre[x]=find(pre[x]);}
inline void unite(int x,int y){pre[find(x)]=find(y);}
inline bool same(int a,int b){return find(a)==find(b);}
int main()
{
int t;cin>>t;
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
init(2*n);
while(m--)
{
char ch; int a,b;
scanf("\n%c%d%d",&ch,&a,&b);
if(ch=='D')
{
unite(a, b+n);
unite(b, a+n);
}
else
{
if(same(a, b+n) || same(b, a+n))
printf("In different gangs.\n");
else if(same(a, b) || same(a+n, b+n))
printf("In the same gang.\n");
else
printf("Not sure yet.\n");
}
}
}
return 0;
}