看了一天的 并查集 路径压缩 做一道简单的题目
现在对它有了一点认识。
还得继续努力 加油。
//题意 判断两个人是不是属于相同的的犯罪集团.不相同 或 不确定 三种可能。
#include<stdio.h>
#define max 100010
int far[max];
int rank[max];
void inti()
{
int i;
for(i=1; i<=max; i++)
{
far[i]=i;//自己独自是一棵树;
rank[i]=0;//开始定义偏移量为0;
}
}
int find_set(int n)//路径压缩 0表示不同 1表示相同
{
int tem;
if(n==far[n])
return n;
tem=far[n];//tem 找到前驱。
far[n]=find_set(tem);
rank[n]=(rank[tem]+rank[n])%2;
return far[n];
}
void Union_set(int a,int b)
{
int aa,bb;
aa=find_set(a);
bb=find_set(b);
far[bb]=aa;
rank[bb]=(rank[a]+1-rank[b])%2;
}
int main()
{
int T;
int n,m,nn,mm;
char a;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
inti();
for(int j=0; j<m; j++)
{
getchar();
scanf("%c %d %d",&a,&nn,&mm);
if(a=='A')
{
// printf("a=%c\n",a);
int ans1=find_set(nn);
int ans2=find_set(mm);
// printf("1=%d 2=%d\n",ans1,ans2);
//判断是不是在一个集合里面。
if(ans1==ans2)
{
if(rank[nn]==rank[mm])
{
printf("In the same gang.\n");
}
else
{
printf("In different gangs.\n");
}
}
else
{
printf("Not sure yet.\n");
}
}
else
{
Union_set(nn,mm);
}
}
}
return 0;
}