您的位置:首页 > 其它

hdoj1232---畅通工程

2018-01-25 13:43 405 查看
hdoj1232-----题目传送门

#include <stdio.h>
int pre[1005];//用于存放父亲节点
int find(int x)
{
//如果代表元是自己则返回自己,否则调用递归pre[x],
//并且把代表元进行更新
return pre[x]==x?x:(pre[x]=find(pre[x]));
}

//合并
void mer(int x,int y)
{
x=find(x);
y=find(y);
if(x<y) pre[x]=y;
else if(x>y) pre[y]=x;

}

int main()
{
int n,m,i,x,y,count;
while(scanf("%d",&n)&&n)
{
scanf("%d",&m);
for(i=1;i<=n;i++)
{
pre[i]=i;
}
for(i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
mer(x,y);
}

count=0;
//代表元是自身的是祖先节点
for(i=1;i<=n;i++)
{
if(pre[i]==i) count++;
}
printf("%d\n",count-1);
// for(i=1;i<=n;i++)
// {
// printf("%d %d %d\n",i,pre[i],find(i));
// }
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: