1. 程式人生 > 其它 >[學習筆記] kruskal重構樹

[學習筆記] kruskal重構樹

如果在一張圖上要解決的問題與圖的連通性有關,且圖上邊的作用僅是改變連通性(不直接對答案產生貢獻)並有一定限制,我們便可以考慮kruskal重構樹

具體來說,只保留一些較優(通常表現為限制較小)的邊,用特殊的手法按限制從小到大不斷加邊,直到圖完全連通,搞一顆樹

為了方便,每次加入一條邊時,把這條邊做成帶權的點,權值設為邊的限制,然後將左右兒子設為這條邊本來連線的點此時所屬子樹的根

這樣我們就建出一顆具有優美性質的二叉樹,也就是kruskal重構樹啦awa

優美的性質是啥?一個點的權值一定 \(\geq\) ta子樹中任意點的權值,樹的葉子節點為確實存在的點(稱之為實點)

現在給定一個限制,詢問某點在此限制下所能到達的點的資訊,是不是很好做?

我們從某個實點帶著限制往上跳,跳到最高的滿足限制的點,此時這個點的子樹就是我們要詢問的集合

然後跳的過程可以帶個倍增,詢問的資訊可以用奇技淫巧直接在樹上維護(因為要提前對整棵樹處理,所以要離線),這就OK啦

樹的規模一般為 \(O(n * 2)\),時間就視情況而定啦qwq

例題:(打√的是蒟蒻博主做過的QWQ)

P4768

P4197

P3224(別問我平衡樹啟發式合併題為什麼要用kruskal重構樹做,問就是想水題解