并查集
来源:互联网 发布:音乐播放设备 知乎 编辑:程序博客网 时间:2024/06/09 15:21
#include <iostream>using namespace std;int parent[100];//构造一个初始并查集,s是集合元素的个数,此时初始化了s个集合,每一个集合都只有一个元素//数组的范围为parent[0]~parent[s-1]//初始的时候,数组元素的值都是 -1,表示此时都是根结点。void ufset(int s){ int si=s; for(int i=0;i<si;i++) parent[i]=-1;}//查找元素x所在集合//从x开始,沿父指针链一直向上,直到向上,直到达到一个父指针域为负值的结点位置int Find(int x) //迭代查找方式{ while(parent[x]>=0) x=parent[x]; return x;}/*int find_1(int x) //递归查找方式{ if(parent[x]<0) return x; //x是根时,直接返回x else return find_1(parent[x]); //否则,递归找x的父的根}*///折叠规则压缩路径法//包含元素i的树中搜索根,并将从元素i到根的路径上的所有结点都变成根的结点int collapsingfind(int i){ int j; for(j=i;parent[j]>=0;j=parent[j]); //搜索j的根 while(i!=j) //向上逐次压缩 { int temp=parent[i]; parent[i]=j; i=temp; } return j; //返回根}//集合的合并//让root2的父指针指向root1即可实现两个集合的合并void Union(int root2,int root1){ parent[root1]+=parent[root2]; parent[root2]=root1;}//使用加权规则得到改进的Union操作void WeightUnion(int root2,int root1){ int r2=Find(root2); //r2和r1是root2和root1的父结点 int r1=Find(root1); int temp; if(r1!=r2) { temp=parent[r1]+parent[r2]; if(parent[r1]<parent[r2]){parent[r1]=temp;parent[r2]=r1;} //以r2根的树结点多 else {parent[r1]=r2;parent[r2]=temp;} }}int main(){ ufset(10); //初始化10个元素 Union(6,0); Union(7,0); Union(8,0); Union(4,1); Union(9,1); Union(3,2); Union(5,2); for(int i=0;i<10;i++) cout<<parent[i]<<" "; return 0;}
0 0
- HDU3938 并查集 并查集
- 并查集(集并查)
- HDU1232 并查集<并>
- 并查集
- 数据结构-并查集
- 并查集
- 并查集!
- 并查集
- 并查集
- 并查集
- 并查集
- 并查集总结
- 并查集学习
- 并查集
- 并查集
- 并查集
- 所谓并查集
- 并查集
- JAVA多线程和并发基础面试问答
- 火狐谷歌chrome等浏览器支持一些css滤镜
- Java中三个引用类SoftReference 、 WeakReference 和 PhantomReference的区别
- UITableView最上面tableHeaderView留空间的两种方法
- emacs 基本命令(无插件扩展)学习笔记(未完成)
- 并查集
- C开发中的单元测试
- mysql in
- CentOS 5.4安装ipvsadm出错以及解决方式
- linux下查看端口命令
- linux下的udev
- Cocos2d-js_____cc.Loader
- 添加别名
- linux下socket编程