http://poj.org/problem?id=1703
题意:有两个不同的敌对帮派,判断它们的关系,敌对的敌对即朋友,种类并查集
#include<iostream>
#include<cstdio>
using namespace std;
const int N=100005;
int father[N],rank[N];
int Find(int x)
{
if(x==father[x]) return father[x];
int t=father[x];
father[x]=Find(father[x]);
rank[x]=(rank[x]+rank[t])%2;
return father[x];
}
void Union(int a,int b)
{
int x=Find(a),y=Find(b);
if(x==y) return;
else
{
father[x]=y;
rank[x]=(rank[a]+rank[b]+1)%2;//
}
}
int main()
{
int T,i,n,m,a,b,x,y;
char cc[2];
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(i=0;i<=n;i++)
{father[i]=i;rank[i]=0;}
for(i=0;i<m;i++)
{
scanf("%s",&cc);
scanf("%d%d",&a,&b);
if(cc[0]=='D')
Union(a,b);
else
{
x=Find(a),y=Find(b);
if(x==y)
{
if(rank[a]==rank[b])
printf("In the same gang.\n");
else
printf("In different gangs.\n");
}
else
printf("Not sure yet.\n");
}
}
}
return 0;
}