标签:
并查集:
1 int pa[maxn],Rank[maxn]; 2 ///初始化 x 集合 3 void make_set(int x) 4 { 5 pa[x]=x; 6 Rank[x]=0; 7 } 8 ///递归查找 x 所在的集合 9 int find_set(int x) 10 { 11 if(pa[x]!=x) pa[x]=find_set(pa[x]); 12 return pa[x]; 13 } 14 ///更新根节点,如果不更新可能会暴栈 15 void mix(int x,int y) 16 { 17 int xx=find_set(x); 18 int yy=find_set(y); 19 if(xx!=yy) 20 { 21 pa[yy]=xx; 22 } 23 } 24 ///锁点,合并 x, y 所在的集合,用到路径压缩,按秩合并 25 ///启发式合并 26 void Union(int x,int y) 27 { 28 x=find_set(x); 29 y=find_set(y); 30 if(Rank[x]>Rank[y]) 31 pa[y]=x; 32 else if(Rank[x]<Rank[y]) 33 pa[x]=y; 34 else if(Rank[x]==Rank[y]) 35 { 36 pa[x]=y; 37 Rank[y]++; 38 } 39 }
初级并查集:HDU-理解 find_set()
题意:n个结点,m条边,求再连几条边能使得全部结点连通;
思路:并查集,求该图中有几个连通分支,然后连通块的个数-1;
标签:
原文地址:http://www.cnblogs.com/ACMERY/p/4526815.html