您的位置:首页 > 其它

POJ 1703 Find them, Catch them【并查集】

2012-08-07 15:40 239 查看
题意: 有 N 个人分属于两个帮派,对应两种操作:

A X Y 询问x,y 是否属于一个帮派,或两者关系不能确定。

D X Y X和Y 分属不同帮派

分析: 感觉就是简化版的食物链...

方法一:

加一个数组 r[i]

r[i] = 0 表示 i 与祖先属于同一个帮派

r[i] = 1 表示 i 与祖先属于不同帮派

View Code

#include<stdio.h>
#include<string.h>
int f[200005];
int find(int x)
{
return f[x]==x?x:(f[x]=find(f[x]));
}
void join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
f[fy]=fx;
}
int main()
{
char s[2];
int t,n,m,a,b,fx,fy,i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=2*n;i++)
f[i]=i;
while(m--)
{
scanf("%s%d%d",s,&a,&b);
if(s[0]=='A')
{
if(find(a+n)==find(b))
printf("In different gangs.\n");
else if(find(a)==find(b))
printf("In the same gang.\n");
else printf("Not sure yet.\n");
}
else
{
join(a,b+n);
join(b,a+n);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: