並查集(union)模板

並查集模板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. }  



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章