题目大意:
输入:第一行测试数目T;
第二行N,M;N个罪犯M个输入;
第3~m+2行,A表示询问,a,b是否同一种类;D,表示a,b不同种类;
种类并查集:
分为1~N,N~2N两类;
a,b第一次出现时是s[a]=a,s[b]=b,
#include<cstdio>
#include<cstring>
#define MAXN 200100
int n,m,s[MAXN];
int Find(int x)
{
if(s[x]<0) return x;
return s[x]=Find(s[x]);
}
int main()
{
int Case;
scanf("%d",&Case);
while(Case--)
{
memset(s,-1,sizeof(s));
scanf("%d%d",&n,&m);
while(m--)
{
char str;
int a,b;
scanf(" %c %d %d",&str,&a,&b);
if(str=='A')
{
if(Find(a)!=Find(b)&&Find(a)!=Find(b+n)) puts("Not sure yet.");
else if(Find(a)==Find(b)) puts("In the same gang.");
else puts("In different gangs.");
}
else
{
if(Find(a)!=Find(b+n))
{
s[Find(a)]=Find(b+n);
s[Find(b)]=Find(a+n);
}
}
}
}
}