并查集常用操作

并查集常用操作

并查集(Union-Find Sets)的两种功能:合并两个集合;查找一个元素属于哪个集合。

并查集的两个优化:基于rank的启发式合并;路径压缩。

以下是我的代码:

#include < stdio.h >
const   long  maxn = 10008 ;
long  n,f[maxn],rank[maxn];
void  Init()
{
    
for ( long  i = 1 ;i <= n;i ++ )
    {
       f[i]
= i;
       rank[i]
= 0 ;
    }
}
long  Getf( long  x)
{
    
if (f[x] == x)  return  x;
    f[x]
= Getf(f[x]); //  路径压缩 
     return  f[x];
}
bool  Same( long  x, long  y)
{
    
return  (Getf(x) == Getf(y));
}
void  Union( long  x, long  y)
{
    
long  fx = Getf(x),fy = Getf(y);
    
if (fx != fy)
    {
       
if (rank[fx] == rank[fy])
       {
          f[fx]
= fy;
          rank[fy]
++ ;
       }
       
else   if (rank[fx] < rank[fy])
         f[fx]
= fy;
       
else  f[fy] = fx;
    }
//  启发式合并 
}
int  main()
{
    n
= 10 ;
    Init();
return   0 ;
}

你可能感兴趣的:(并查集常用操作)