并查集(保存分组结果)
2015-07-16 19:50
302 查看
//如果只是输出有多少个团伙,那么只要比较pre[i]==i即可,但是若要求将不同的组织分行打印出来,那么需要注意要再压缩一次路径,即再find()一次~
#include <stdio.h> int pre[101]; void merge(int b,int c); int find(int i); int main() { int i,m,n,c,d,sum,ok; scanf("%d%d",&n,&m); for (i=1;i<=n;i++) pre[i]=i; for (i=1;i<=m;i++) { scanf("%d%d",&c,&d); merge(c,d); } sum=0; for (i=1;i<=n;i++) if (pre[i]==i) sum++; printf("%d\n",sum); sum=1; for (i=1;i<=n;i++) find(i); while (sum<=n) { ok=0; for (i=1;i<=n;i++) if (pre[i]==sum) { ok=1; printf("%d ",i); } if (ok) printf("\n"); sum++; } return 0; } int find(int i) { int j=i,temp; while (pre[i]!=i) i=pre[i]; while (j!=i) { temp=pre[j];//先记录下下一个长官 pre[j]=i;//统一都更新为i的手下 j=temp;//迭代 } return i; } void merge(int b,int c) { int t1,t2; t1=find(b); t2=find(c); if (t1!=t2) pre[t2]=t1; return; }
相关文章推荐
- iOS开发 ----- vim相关以及常用shell命令
- delphi 遍历控件
- linux下使用crontab实现定时PHP计划任务失败的原因分析
- 【数据库范式】第二范式分析
- NGUI--SpringPanel总结
- maven实战学习(二)--------------maven安装和配置
- TextView圆角
- DIDM源码分析
- 2015 HUAS Provincial Select Contest #1 D
- ]获取android应用的MD5签名
- 堆的应用!--求第k大数
- 【甘道夫】HBase基本数据操作详解【完整版,绝对精品】
- 【试水CAS-4.0.3】第03节_CAS服务端登录页添加验证码
- 特征选择
- 使用history.back()出现"警告: 网页已过期的解决办法"
- 如何在Myeclipse中添加插件?
- 国内外BaaS服务盘点
- Android学习2——Activity之间跳转
- JQuery显示隐藏一个按钮
- JS前端框架10 Extjs5 使用Tips