这个题是给你一些信息,D a b表示a和b是不同的,A a b是询问a、b是否是相同的
用并查集做,这个题同样需要用到偏移量的思想,给所有人分组分别标号为1和0,然后更新的时候注意更新偏移量即可
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1e5+100;
int n,m,p[maxn],diff[maxn];
int find(int x)
{
if(p[x]==-1)
return x;
int y=p[x];
p[x]=find(p[x]);
diff[x]=(diff[y]+diff[x])%2;
return p[x];
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(p,-1,sizeof(p));
memset(diff,0,sizeof(diff));
while(m--)
{
char op[5];
int a,b;
scanf("%s%d%d",op,&a,&b);
if(op[0]=='A')
{
int x=find(a);
int y=find(b);
if(x!=y)
printf("Not sure yet.\n");
else if(x==y&&diff[a]==diff[b])
printf("In the same gang.\n");
else
printf("In different gangs.\n");
}
else
{
int x=find(a);
int y=find(b);
if(x!=y)
{
p[x]=y;
diff[x]=(diff[a]+diff[b]+1)%2;
}
}
}
}
return 0;
}