首页 > 其他 > 详细

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

时间:2015-02-28 21:28:56      阅读:296      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!