并查集优化
来源:互联网 发布:房间刮塑面积算法 编辑:程序博客网 时间:2024/06/16 01:22
按秩合并
矮树合并到高树
void Union(int a, int b) { if(tree[a].weight == tree[b].weight) { tree[b].parent = a; tree[a].weight += 1; } else if (tree[a].weight > tree[b].weight) { tree[b].parent = a; } else { tree[a].parent = b; }}
将查找到的节点均指向根节点
递归
int Find(int x) { if(root[x] == -1) { return x; } return root[x] = Find(root[x]);}
非递归
int Find (int n) { int r = n; while (r != root[r]) { r = root[r]; } int x = n, y; while (x != r) { //压缩路径,全部赋值为根结点的值 y = root[x]; root[x] = r; x = y; } return r;}
例题 HDU 1856 http://acm.hdu.edu.cn/showproblem.php?pid=1856
#include <stdio.h>#define maxn 10000005struct Node{ int m; int rank;}tree[maxn];int mm,pre[maxn];int Find(int x){ int p = x; while(tree[p].m != p) { p = tree[p].m; } int i = x; while(i != p) { int j = tree[i].m; tree[i].m = p; i = j; } return p;}int hb(int x,int y){ int fx=Find(x); int fy=Find(y); if(fx!=fy) { tree[fy].rank+= tree[fx].rank; if(tree[fy].rank>mm) mm=tree[fy].rank; tree[fx].m=fy; }}int main(){ int t,i; int x,y; while(~scanf("%d",&t)) { mm=1; for(i=0;i<t;i++) { tree[i].m=i; tree[i].rank=1; } for(i=0;i<t;i++) { scanf("%d%d",&x,&y); hb(x,y); } printf("%d\n",mm); }}
0 0
- 并查集优化
- frindship(优化并查集)
- 并查集及优化
- 并查集的优化
- poj 1456 贪心+并查集优化
- hdu1213+并查集模板(优化)
- 并查集优化之路径压缩
- 并查集的链表优化
- 并查集-一笔画优化
- 并查集优化下-3
- 并查集及优化(C++)
- bzoj 1098 dfs+并查集优化
- 并查集的优化措施
- 并查集--算法,优化,变种
- Building Block(并查集 优化)
- 并查集的“并优化”(leader合并)和“查优化”(路径压缩)
- hdu1512 & zoj2334Monkey King (左偏树 + 并查集(非优化的朴素并查集))
- 十、森林与并查集---(6)并查集路径压缩优化
- Ubuntu中安装sdk(求教!)
- Java:利用TCP编程进行文件下载
- MessageDigest类的使用
- Ubuntu 更改文件夹及子文件夹权限
- 开始学习PHP,
- 并查集优化
- POJ 1679
- 离子感烟探测器的工作原理介绍
- 一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(7)--XSLT列表视图web部件
- fdsfdsfdg
- 海尔推出空气盒子的背后阳谋
- Jarvis后台管理模板
- 程序BUG:程序编辑错误解决方案
- shell 判断字符串中是否含有指定字符