第一种并查集
2015-07-11 10:59
344 查看
一个很好的ppt:http://wenku.baidu.com/link?url=QyYfqfqfJPapm1ZzHBLdcg3lEEeCQOeCrdFGsNgZl5nJpjAyjYcD6zHx3BmGYR79vjLFZHDKNEuJ0YIcjoBOTJej6hOTndxaltHj15i6s3e
/** 4 2 1 3 4 3 0 1 2 3 4 0 1 2 1 3 */ #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int Set[1010]; int M,N; void Mergel(int a,int b){ int i=min(a,b); int j=max(a,b); for(int k=1;k<=N;k++) { if(Set[k] == j) Set[k]=i; } } int main() { while(scanf("%d",&N),N!=0){ scanf("%d",&M); for(int i=0;i<=N;i++) { Set[i]=i; } while(M--){ int x,y; scanf("%d%d",&x,&y); Mergel(x,y); } for(int i=0;i<=N;i++) { printf("%d ",i); } printf("\n"); for(int i=0;i<=N;i++) { printf("%d ",Set[i]); } } return 0; }
属于一个集合的所代表的值不会归到一类,还是需要查找
/** 4 2 1 3 4 3 0 1 2 3 4 0 1 2 1 3 */ #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int Set[1010]; int M,N; int find2(int x){ int r=x; while(Set[r]!=r) r=Set[r]; return r; } void Mergel(int a,int b){ int i=min(a,b); int j=max(a,b); for(int k=1;k<=N;k++) { if(Set[k] == j) Set[k]=i; } } int main() { while(scanf("%d",&N),N!=0){ scanf("%d",&M); for(int i=0;i<=N;i++) { Set[i]=i; } while(M--){ int x,y; scanf("%d%d",&x,&y); Mergel(x,y); } for(int i=0;i<=N;i++) { printf("%d ",i); } printf("\n"); for(int i=0;i<=N;i++) { printf("%d ",Set[i]); } printf("\n4属于哪一个集合\n"); printf("%d\n",find2(4)); } return 0; }
相关文章推荐
- Window7 家庭版 IIS 配置
- MIPS嵌入式linux 分析
- 黑马程序员——Java 多线程
- MotionEvent事件传递个人总结
- ORA-01113,ORA-01110的简单解决
- txt 开关 csv 可通用 工具
- 解决Nginx下WordPress后台404的问题
- Yii 不完全解决方案(一)
- C语言文件的输入输出_学生的信息
- 【leetcode】Longest Valid Parentheses
- 《小时代》系列收官:别笑人奇葩,看这部现象级电影产品留下哪些
- GCD编程-串行队列与并发队列
- 如何用C语言封装 C++的类,在 C里面使用
- Stockbroker Grapevine - poj 1125 (Floyd算法)
- POJ-1862-Stripies(贪心4)
- zabbix配置脚本服务端与客户端
- 第四次作业
- 阶乘因式分解(二)
- xml序列化、pull解析XML
- Uboot详解