题目链接:http://poj.org/problem?id=1703
题目大意:在一个城市里有两个犯罪团伙,现给你两个人,请你判断他们是否在一个犯罪团伙。。。
这道题也是种类并查集的基础应用吧,代码如下:
#include<stdio.h>
struct node
{
int f;//父节点
int r;//关系
} s[100005];
int find(int x)
{
int temp;
if(x==s[x].f) return x;
temp=s[x].f;
s[x].f=find(temp);
s[x].r=(s[x].r+s[temp].r)%2;//利用向量更新关系
return s[x].f;
}
int main()
{
int t,m,n,i;
int x,y,ans;
char d[2];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
ans=0;
for(i=1; i<=n; i++)
{
s[i].f=i;
s[i].r=0;//初始化自己为一类,即为0
}
for(i=1; i<=m; i++)
{
scanf("%s%d%d",d,&x,&y);
int rootx=find(x);
int rooty=find(y);
if(d[0]=='A')
{
if(rootx==rooty)
{
if(s[x].r!=s[y].r)
printf("In different gangs.\n");
else
printf("In the same gang.\n");
}
else
{
printf("Not sure yet.\n");
}
}
else
{
if(rootx!=rooty)
{
s[rooty].f=rootx;
s[rooty].r=(s[x].r+1-s[y].r+2)%2;//向量更新
}
}
}
}
}