码迷,mamicode.com
首页 > 其他好文 > 详细

并查集,以及可拆分并查集

时间:2015-02-28 21:30:11      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:

普通并查集. 合并 均摊O(α(n)) 查询 均摊O(α(n))

 1 //常用版本
 2 
 3 //Union Find
 4 int f[1005000];
 5 
 6 void INIT(int size)
 7 { for(int i=0;i<=size;i++) f[i]=i; }
 8 
 9 int findf(int x) 
10 { return f[x]==x ? x : f[x]=findf(f[x]); };
11 
12 int connect(int x)
13 { f[findf(a)]=findf(b); }

 

可拆分并查集. 最坏情况: 合并 O(n) 查询 O(n) 拆分 O(n)   平均情况: 合并 O(logn) 查询 O(logn) 拆分 O(logn)

 1 //可拆分版本
 2 //Union Find
 3 int f[1005000];
 4 
 5 void INIT(int size)
 6 { for(int i=0;i<=size;i++) f[i]=i; }
 7 
 8 int findf(int x)
 9 { for(;x!=f[x];x=f[x]); }
10 
11 void setroot(int x)
12 { if(f[x]!=x) setroot(f[x]); f[x]=f[f[x]]=x; }
13 
14 inline void link(int x,int y)
15 { setroot(x); f[x]=y; }
16  
17 inline void cut(int x,int y)
18 { setroot(x); f[y]=y; }

 

可以看到后边这种比较像LCT...

并查集,以及可拆分并查集

标签:

原文地址:http://www.cnblogs.com/DragoonKiller/p/4306169.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!