- int findset(int x)//查
- {
- if(x != father[x])
- father[x]=findset(father[x]);//查的過程中進行路徑壓縮,有效加快並查集運算
- return father[x];
- }
- int unionset(int a, int b)//並
- {
- int x=findset(a);
- int y=findset(b);
-
-
if(x
!= y) //不在同一根上,進行合併操作
-
- father[y]=x;
- return 0;
- }
- int parent[Max]; //記錄結點的雙親
-
- int rank[Max]; //記錄結點的深度
- void init(int n) //初始化
- {
- int i;
- for(i=0;i<=n;i++)
- {
- parent[i]=i;
- rank[i]=1;
- }
- }
- int find(int x) //查找
- {
- int t=x, temp;
- while(parent[x]!=x) //找所屬集合,即根結點
- x=parent[x]; //x爲最終找到的根節點
- while(parent[t]!=x)
- {
- //路徑壓縮,使深度不爲1的點向上浮。
- temp=parent[t];
- parent[t]=x;
- rank[t]=1;
- t=temp;
- }
-
return x;
-
- //x爲最終找到的根節點
-
- }
-
- void merge(int x,int y) //合併
- {
- int tx=find(x);
- int ty=find(y);
- if(tx!=ty) //路徑壓縮 ,合併操作,離根距離更遠的節點,向近的合併靠攏
- {
- if (rank[tx]<rank[ty])
- {
- parent[ty]=tx;
- rank[ty]+=rank[tx];
- rank[tx]=1;
- }
- else
- {
- parent[tx]=ty;
- rank[tx]+=rank[ty];
- rank[ty]=1;
- }
- }
- }