并查集(union)模板

来源:互联网 发布:ubuntu提示权限不够 编辑:程序博客网 时间:2024/06/18 15:16
并查集模板1(常用)

  1. int findset(int x)//查    
  2. {    
  3.     if(x != father[x])    
  4.         father[x]=findset(father[x]);//查的过程中进行路径压缩,有效加快并查集运算    
  5.     return father[x];    
  6. }    
  7.     
  8. int unionset(int a, int b)//并    
  9. {    
  10.     int x=findset(a);    
  11.     int y=findset(b);    

  12.     if(x != y)     //不在同一根上,进行合并操作
    1.  
      1.    
  13.         father[y]=x;
  14.     return 0;    
  15. }   

并查集模板2

  1. int parent[Max]; //记录结点的双亲   

  2. int rank[Max];   //记录结点的深度  
  3.   
  4. void init(int n)   //初始化   
  5. {  
  6.    int i;  
  7.    for(i=0;i<=n;i++)  
  8.    {  
  9.       parent[i]=i;  
  10.       rank[i]=1;   
  11.    }  
  12. }   
  13. int find(int x)    //查找   
  14. {  
  15.    int t=x, temp;  
  16.    while(parent[x]!=x) //找所属集合,即根结点        
  17.          
  18.          x=parent[x];  //x为最终找到的根节点    
  19.    
  20.     while(parent[t]!=x)    
  21.     {   
  22.        //路径压缩,使深度不为1的点向上浮。  
  23.        temp=parent[t];     
  24.        parent[t]=x;          
  25.        rank[t]=1;      
  26.        t=temp;    
  27.     }   
  28.    return x;   
      1. //x为最终找到的根节点 
  29. }  

  30. void merge(int x,int y)    //合并   
  31. {    
  32.      int tx=find(x);     
  33.      int ty=find(y);    
  34.      if(tx!=ty)  //路径压缩 ,合并操作,离根距离更远的节点,向近的合并靠拢  
  35.      {  
  36.         if (rank[tx]<rank[ty])    
  37.         {  
  38.            parent[ty]=tx;  
  39.            rank[ty]+=rank[tx];   
  40.            rank[tx]=1;        
  41.         }  
  42.         else    
  43.         {  
  44.            parent[tx]=ty;  
  45.            rank[tx]+=rank[ty];  
  46.            rank[ty]=1;        
  47.         }       
  48.     }   
  49. }  



0 0