问题描述:
#include
#include
#define MAX_N 10005
using namespace std;
int par[MAX_N],a[MAX_N];
//a[0]表示与父节点同gang,a[1]表示与父节点不同gang
void make_set(int n)
{
for(int i=1;i<=n;i++)
{
par[i]=i;
a[i]=0;
}
}
int find_set(int x)//路径压缩的同时,修改各节点对父节点的偏移量,因为只有父节点变了
{
if(par[x]==x) return x;
int t=par[x];
par[x]=find_set(par[x]);//x直接指向根节点,路径压缩,x对父节点的偏移量就是就是对根节点的偏移量
a[x]=(a[par[x]]+a[x])%2;
return par[x];
//每次跟新新加入的数与父节点的关系,比如,最开始1,2
//a[1]=0;a[2]=0;经过unite,1->2,a[1]=1,a[2]=0;再输入1,4,a[1]=1
}
void unite(int x,int y)
{
int fx=find_set(x); //
int fy=find_set(y);
par[fx]=fy;// 表示每次都更新父节点
if(a[y]==0) //表示y 为根节点
a[fx]=1-a[x];
else
a[fx]=a[x];
}
int main()
{
int t,n,m,x,y,fx,fy;
char S[20];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%s%d%d",S,&x,&y);
if(S[0]=='A')
{
fx=find_set(x);
fy=find_set(y);
if(fx!=fy) printf("Not sure yet.\n");
else if(a[x]==a[y])
printf("In different gangs.\n");
else
printf("In the same gangs.\n");
}
else
unite(x,y);
}
}
return 0;
}