void init()
}
int findroot(int x)
return findroot(pre[x]);//否則一直往上找,找其最頂層的根結點
}
//遞迴方式:
int findroot(int x)
return pre[x]=findroot(pre[x]);//否則一直往上找,找其最頂層的根結點,並將路徑上的關聯點都加到根結點上
}//迭代方式:
int findroot(int x)
return x;
}
int getroot(int x)
void merge(int x,int y)
}
int rk[maxn];
void merge(int x,int y)
else
}}
void merge(int x,int y)
}
//初始化函式:
void init()
}//找根函式(+路徑壓縮):
int findroot(int x)
return pre[x]=findroot(pre[x]);//否則一直往上找,找其最頂層的根結點,並將路徑上的關聯點都加到其下
}//合併函式(+按秩序合併):
void merge(int x,int y)
else
}}
注:
1、整個圖的連通分量個數<==>根結點的個數
2、根結點特點:其父結點的編號為其自身的編號(即:pre[root]=root)
並查集 按秩合併 路徑壓縮
一種可以動態維護若干個不重疊的集合或無向圖的連通塊的資料結構。主要支援以下操作 find 查詢乙個元素屬於哪個集合 merge 合併兩個集合 並查集的每個集合都需要乙個 爹 來表示這整個集合,所以判斷兩個元素是否在同一集合,就看他們爹是否相同。有乙個顯而易見的初始化,對於要維護的序列,初始每個元素的...
並查集(路徑壓縮 按秩合併) 總結
就是連邊,然後,每次問你兩個點是否可互通。為無向邊 然後,暴力的話可能就是一條鏈下來,搞爆了。所以我們要想想優化。個人覺得這個比較好理解,很早便學會了,而且速度要優秀一些。就是將連了邊的同時指向乙個人 自擬的祖宗 然後,每次查詢的時候就壓縮一下路徑。具體是這樣來搞的 intgf int x intm...
並查集判斷環 並查集的路徑壓縮 和 帶秩優化
1.判斷環 參考部落格 思路 1.將用過的路徑連起來成為乙個集合,記錄下來 2.如果連通的兩個邊屬於乙個集合,那麼這個並查集就形成了乙個環 燈神 如果刪除2,4邊 可將2,4這條邊刪除測試 是否正確 如果刪除此邊則不會出現環記得將6改為5 initialise parent for int i 0 ...