就是連邊,然後,每次問你兩個點是否可互通。為無向邊
然後,暴力的話可能就是一條鏈下來,搞爆了。所以我們要想想優化。
個人覺得這個比較好理解,很早便學會了,而且速度要優秀一些。
就是將連了邊的同時指向乙個人(自擬的祖宗),然後,每次查詢的時候就壓縮一下路徑。
具體是這樣來搞的:
intgf(
int x)
intmain()
其中fa[i]的初值為0。
這樣子就實現了路徑壓縮了,每條邊最多走一次。很方便。
這個優化我還是最近才學會了。也比較容易的。
秩就是樹高
不壓縮路徑,就像splay那樣子,保證其中每個點的深度都<=log2(n)。
只需記錄一下每個點的樹高(它到子樹中任意節點的步數的最大值)即可。**如下:
intgf(
int x)
intmain()
並查集的例題還是有很多的,不怎麼熟的可以練一練。 並查集 按秩合併 路徑壓縮
一種可以動態維護若干個不重疊的集合或無向圖的連通塊的資料結構。主要支援以下操作 find 查詢乙個元素屬於哪個集合 merge 合併兩個集合 並查集的每個集合都需要乙個 爹 來表示這整個集合,所以判斷兩個元素是否在同一集合,就看他們爹是否相同。有乙個顯而易見的初始化,對於要維護的序列,初始每個元素的...
並查集模板 (路徑壓縮 秩的合併)優化
void init int findroot int x return findroot pre x 否則一直往上找,找其最頂層的根結點 遞迴方式 int findroot int x return pre x findroot pre x 否則一直往上找,找其最頂層的根結點,並將路徑上的關聯點都加...
資料結構之並查集 按秩合併與路徑壓縮優化
1.並查集描述 一些有n nn個元素的集合應用問題中,我們通常是在開始時讓每個元素構成乙個單元素的集合,然後按一定順序將屬於同一組的元素所在的集合合併,其間要反覆查詢乙個元素在哪個集合中。為了快速解決這些問題,便有了並查集的概念。並查集維護了乙個不相交的動態集的集合s1,s2,sns1 s2 sn ...