杭电1232畅通工程那题,为什么不能通过?忘高手指点一下!只求指出错误之处,不要代码!!!!

来源:百度知道 编辑:UC知道 时间:2024/06/14 00:45:17
#include<stdio.h>
int find(int sh[],int t)
{
while(sh[t]!=-1)
t=sh[t];
return t;
}
int main()
{
int ch[1001];
int n,m;
int t1,t2,a,b;
int sum,i;
while(scanf("%d",&m),m)
{
scanf("%d",&n);
sum=0;
for(i=0;i<=m;i++)
ch[i]=-1;
for(i=1;i<=n;i++)
{
scanf("%d %d",&t1,&t2);
a=find(ch,t1);
b=find(ch,t2);
if(a!=b)
{
if(a>b)
ch[t2]=a;
else
ch[t1]=b;
}
}
for(i=1;i<=m;i++)
{
if(ch[i]==-1)
sum++;
}
printf("%d\n",sum-1);
}
return 0;
}
用的精简版的并查集,但不知道什么地方有问题。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232

1.并查集写的不对,初始化每个节点父节点应该指向自己,而不是空节点。统计连通分量的写法也不对,统计的是所有节点的归属节点数目。
2.没有压缩路径优化的并查集效率太低,还不如求连通分量数来得快。