1.通過比較並查集的大小來連邊,將小的(u)向大的(v)連邊,這樣對於大的並查集,查詢代價不變,而小的並查集查詢代價每個點增加了1,相當於增加了siz[u],(反過來則變成了siz[v]),siz[u]\(logn\),因為每上一層大小減半
2.相較於路徑壓縮的並查集,他可以保留原始的資訊
例題:[bzoj4668]冷戰
code:
#include#include#include#include#includeusing namespace std;
const int maxx=500010;
int f[maxx],siz[maxx],edge[maxx],deep[maxx];
int n,m,tim,last;
inline int find(int x)
}inline int read()
while(isdigit(c))
return f?-x:x;
}int main()
for(int i=1;i<=m;++i)else
while(x!=y)//相當於尋找lca
last=ans;
printf("%d\n",ans);}}
return 0;
}
並查集 按秩合併 路徑壓縮
一種可以動態維護若干個不重疊的集合或無向圖的連通塊的資料結構。主要支援以下操作 find 查詢乙個元素屬於哪個集合 merge 合併兩個集合 並查集的每個集合都需要乙個 爹 來表示這整個集合,所以判斷兩個元素是否在同一集合,就看他們爹是否相同。有乙個顯而易見的初始化,對於要維護的序列,初始每個元素的...
並查集(路徑壓縮 按秩合併) 總結
就是連邊,然後,每次問你兩個點是否可互通。為無向邊 然後,暴力的話可能就是一條鏈下來,搞爆了。所以我們要想想優化。個人覺得這個比較好理解,很早便學會了,而且速度要優秀一些。就是將連了邊的同時指向乙個人 自擬的祖宗 然後,每次查詢的時候就壓縮一下路徑。具體是這樣來搞的 intgf int x intm...
BZOJ4668 冷戰 並查集 按秩合併
題意 還可以這樣亂搞 並查集按秩合併的好處 深度不會超過 o log n 樹的結構保持較穩定 雖說連邊的時候依舊是祖先來連邊,但連邊不會改變原來的結構,並且 u,v 路徑上會經過新連的邊 於是就可以亂搞了 維護乙個按秩合併的並查集,給連邊操作加時間戳,查詢的時候暴力求路徑上時間戳最大值 ps 暴力l...