您的位置:首页 > 其它

zoj 1789 The Suspects (并查集)

2011-08-10 16:48 363 查看
并查集,一直wa,找了好长时间,才找到错误
#include<stdio.h>
#include<stdlib.h>
int father[30005];
int n,m,i,t,a,b,k,fa;
int find(int x)
{
return father[x]==x?x:find(father[x]);
}
void Union(int x,int y)
{
int fx,fy;
fx=find(x);
fy=find(y);
if(fx<fy)//当时错误就出在这里,一开始我在主函数里比较x,y的大小,但x大不代表x的根就大。最后要看每个数的根是否是0,就必须让根大的并到根小的
father[fy]=fx;//第二个错误就在这里,开始在father[]中填的x,y,这样会缺失数据,如输入2 3 7 和0 3 4输出就错误,必须让一个数的根并过去
else
father[fx]=fy;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
for(i=0;i<n;i++)
father[i]=i;
while(m--)
{
scanf("%d",&t);
scanf("%d",&a);
for(i=1;i<t;i++)
{
scanf("%d",&b);
Union(a,b);
}
}
k=0;
for(i=0;i<n;i++)
{
fa=find(i);
if(fa==0)
k++;
}
printf("%d\n",k);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: