Missa 发表于 2012-12-13 21:25:45

数据结构之并查集小结

<div id="cnblogs_post_body">数据结构---并查集小结
               By-Missa
   并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。 (百度百科)
大体分为三个:普通的并查集,带种类的并查集,扩展的并查集(主要是必须指定合并时的父子关系,或者统计一些数据,比如此集合内的元素数目。)
<div class="cnblogs_code" >http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gifhttp://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gifView Code <div id="cnblogs_code_open_355b78b9-4551-4621-969d-583c9074fab6" class="cnblogs_code_hide"> 1 #define MAXN 100005 2 int n,m,k,fa; 3 int rank; 4 void init(int n)//初始化 5 { 6   for(int i=0;i<=n;i++) 7     { 8         fa=i; 9         rank=0;10     }11 }12 //查找的时候,进行路径压缩fa=find(fa)13 //把查找路径上的结点都指向根结点,减少树的高度。14 int find(int x)15 {16   if(x != fa)17         fa=find(fa);//路径压缩18   return fa;19 }20 //合并21 void unio(int x,int y)22 {23   int fx=find(x),fy=find(y);24   if(fx==fy) return ;25   if(rank<rank)//将rank值小的合并到大的中26         fa=fx;27   else28     {29         fa=fy;30         if(rank==rank)31             rank++;32     }33 }34 //或(忽略按秩合并,懒的时候经常这么敲.....时间上也不知道会差多少,没有试过。。):35 void unio(int x,int y)36 {37   int fx=find(x),fy=find(y);38   if(fx==fy) return ;39   fa=fx;40 }
页: [1]
查看完整版本: 数据结构之并查集小结