并查集
来源:互联网 发布:k9源码论坛 编辑:程序博客网 时间:2024/04/27 14:15
#include
int pre[1000 ];
int find(int a)
{
if(pre[a]==a)
return a;
else
return pre[a]=find(pre[a]);
}
//int find(int x) {
//int r=x;
//while (pre[r ]!=r)
//r=pre[r ];
//int i=x; int j;
//while(i!=r)
//{
//j=pre[i]; pre[i]=r; i=j;
//}
//return r;
//}
int main()
{ int n,m,p1,p2,i,total,f1,f2;
while(scanf("%d",&n) && n)//读入n,如果n为0,结束 {//刚开始的时候,有n个城镇,一条路都没有 //那么要修n-1条路才能把它们连起来
{total=n-1;
//每个点互相独立,自成一个集合,从1编号到n //所以每个点的上级都是自己
for(i=1;i<=n;i++) { pre[i ]=i; } //共有m条路
scanf("%d",&m); while(m--) {//下面这段代码,其实就是join函数,只是稍作改动以适应题目要求
//每读入一条路,看它的端点p1,p2是否已经在一个连通分支里了
scanf("%d %d",&p1,&p2);
f1=find(p1); f2=find(p2);
//如果是不连通的,那么把这两个分支连起来
//分支的总数就减少了1,还需建的路也就减了1
if(f1!=f2) { pre[f1 ]=f2; total--;
}
//如果两点已经连通了,那么这条路只是在图上增加了一个环 //对连通性没有任何影响,无视掉
}
//最后输出还要修的路条数
printf("%d\n",total); }
return 0;
}
int pre[1000 ];
int find(int a)
{
}
//int find(int x) {
//int r=x;
//while (pre[r ]!=r)
//r=pre[r ];
//int i=x; int j;
//while(i!=r)
//{
//j=pre[i]; pre[i]=r; i=j;
//}
//return r;
//}
int main()
{ int n,m,p1,p2,i,total,f1,f2;
while(scanf("%d",&n) && n)//读入n,如果n为0,结束 {//刚开始的时候,有n个城镇,一条路都没有 //那么要修n-1条路才能把它们连起来
{total=n-1;
//每个点互相独立,自成一个集合,从1编号到n //所以每个点的上级都是自己
for(i=1;i<=n;i++) { pre[i ]=i; } //共有m条路
scanf("%d",&m); while(m--) {//下面这段代码,其实就是join函数,只是稍作改动以适应题目要求
//每读入一条路,看它的端点p1,p2是否已经在一个连通分支里了
scanf("%d %d",&p1,&p2);
f1=find(p1); f2=find(p2);
//如果是不连通的,那么把这两个分支连起来
//分支的总数就减少了1,还需建的路也就减了1
if(f1!=f2) { pre[f1 ]=f2; total--;
}
//如果两点已经连通了,那么这条路只是在图上增加了一个环 //对连通性没有任何影响,无视掉
}
//最后输出还要修的路条数
printf("%d\n",total); }
return 0;
}
0 0
- HDU3938 并查集 并查集
- 并查集(集并查)
- HDU1232 并查集<并>
- 并查集
- 数据结构-并查集
- 并查集
- 并查集!
- 并查集
- 并查集
- 并查集
- 并查集
- 并查集总结
- 并查集学习
- 并查集
- 并查集
- 并查集
- 所谓并查集
- 并查集
- iOS 开发百问(9)
- Java中的enum类
- matlab基础
- 开始iOS 7中自动布局教程(一)
- ActionSheet样式UIAlertController的正确使用
- 并查集
- 网站建设基本流程规范
- SpringMVC整合Ehcache
- Python中的StringIO与cStringIO简析
- 设置oracle帐号密码永久不过期
- 苹果零售业务主管Angela Ahrendts的薪水是库克的8倍
- Restore IP Addresses
- GTK常用控件之进度条( GtkProgressBar )
- AngularJS体验式编程系列文章