樹形結構 並查集 帶權並查集

2021-08-22 06:14:40 字數 887 閱讀 4419

定義:帶權並查集即是結點存有權值資訊的並查集。

適用:當兩個元素之間的關係可以量化,並且關係可以合併時,可以使用帶權並查集來維護元素之間的關係。

權值:帶權並查集每個元素的權通常描述其與並查集中祖先的關係,這種關係如何合併,路徑壓縮時就如何壓縮。

與並查集的區別:帶權並查集可以推算集合內點的關係,而一般並查集只能判斷屬於某個集合。

帶權並查集只是在並查集中加入了乙個 value[n] 陣列,與之相應,在 find 函式與 union 函式中也有改變。

對於並查集中每一棵樹,設樹根距離為 0,以樹根為參考,每個結點的權值代表與根節點的距離。

合併兩個元素時,假設 a、b 屬於不同的樹,如果合併這兩棵樹,把 a 樹合併到 b 樹上,就需要給 a 樹跟他的根結點賦值,假設於 a、b 的權值 wa、wb,由於兩權值代表的都是與根結點的距離,分析可知,給根結點所賦的值=wa-wb+x。

此時,對於原來的結點 a,只更新了 a 與他的根結點的權值,因此其他結點的更新在查詢中實現即可。

int find(int x)

int union(int x,int y,int w)

種類統計問題比普通並查集新增一屬性,常用於表示它和 father[i] 的關係,例如:用 group[i] 表示和 father[i] 的關係,同類可以用 0 表示,其他兩種分別用 1 表示該結點被父節點吃,2 表示該節點吃父節點。

統計問題一般是對某種屬性進行統計,新增一屬性,在路徑壓縮時執行即可,例如:cnt[x] += cnt[fa]

區間問題一般是記錄某區間 [l,r] 的資料,此類問題需要對所有值統計設定相同的初值,但初值的大小一般沒有影響,對區間 [l, r] 進行記錄時,實際上是對 (l-1, r] 操作,即 l = l - 1(勢差是在 l-1 和 r 之間) 

並查集,帶權並查集

題意 ignatius過生日,客人來到,他想知道他需要準備多少張桌子。然而一張桌子上面只能坐上相互熟悉的人,其中熟悉可定義成為a與b認識,b與c認識,我們就說a,b,c相互熟悉 例如a與b熟悉and b與c熟悉,d與e熟悉,此時至少需要兩張桌子。輸入 t表示樣例個數,n表示朋友個數,朋友從1到n編號...

並查集和帶權並查集

並查集是乙個很高效演算法,理解起來也很簡單,寫起來更簡單。fat i i 找到乙個點的祖先 int findfat int x 二中的方法肯定不好,因為如果資料比較極端,那麼並查集就退化成乙個鏈了 如果加入了路徑壓縮,並查集這個演算法就更高效了。int findfat int x 遞迴寫法 int ...

並查集與帶權並查集

1.找點的祖先 fa i i 並查集的快主要在於路徑壓縮。1 遞迴寫法 int find int x 2 非遞迴寫法 int find int x return r 2.合併 合併2者的集合。void merge int x,int y 3.帶權並查集 一般是存下一些2者之間的具體的數量關係或者是統...