這個知識點好像咕咕咕了好長了。。趁還沒退役趕緊補一下吧。。
講的非常簡略,十分抱歉。。
kruskal演算法
一定的資料結構基礎(如主席樹)
直接bb好像不是很好講,那就從這道題入手吧。
在bytemountains有$n$座山峰,每座山峰有他的高度$h_i$。首先,這是一張圖(你在說大實話麼)有些山峰之間有雙向道路相連,共$m$條路徑,每條路徑有乙個困難值,這個值越大表示越難走.
現在有$q$組詢問,每組詢問詢問從點$v$開始只經過困難值小於等於$x$的路徑所能到達的山峰中第$k$高的山峰,如果無解輸出$-1$
對於乙個點來說,經過困難值小於等於$x$的路徑所能到達的點是一定的。
但是這和生成樹有啥關係呢?
顯然,若乙個點能通過一條路徑到達,那麼我們走最小生成樹上的邊也一定能到達該節點。
這樣我們把最小生成樹建出來,就可以少考慮很多邊了。
然而並沒有什麼卵用。。
現在我們需要做的,是找一種方法,能夠維護出乙個點能到達的點。
於是kruskal重構樹就誕生了。
它的思想是這樣的:
在執行kruskal演算法的過程中,對於兩個可以合併的節點$(x, y)$,斷開其中的連邊,並新建乙個節點$t$,把$t$向$(x, y)$連邊作為他們的父親,同時把$(x, y)$之間的邊權當做$t$的點權
比如說
重構之後是這樣的:
這樣我們得到了乙個新的樹,考慮它有什麼性質。
其中最重要的一條就是:乙個節點能走到的節點一定在它的子樹中
然後這道題就做完了,直接dfs序+主席樹即可
當然,除了這一條之外,kruskal重構樹還有很多有意思的性質
是乙個二叉樹
如果是按最小生成樹建立的話是乙個大根堆(important!)
任意兩個點路徑上邊權的最大值為它們的lca的點權
[noi2018]歸程
樹 kruskal重構樹
學習資料 hwzzyr的部落格 定義?在kruskal演算法的過程中,把最小生成樹的邊權改為點權而構建的二叉樹。拋開kruskal演算法來講,對原圖 注意,不止對樹,圖也可以 的邊集進行排序,然後將邊當成節點建樹。性質 構造 code void buildkt for int i 1,up n m ...
Kruskal重構樹 學習筆記
kruskal重構樹 性質 1.是乙個小 大根堆 由建樹時邊權的排序方式決定 2.lca u,v 的權值是原圖u到v路徑上最大 小邊權的最小 大值 由建樹時邊權的排序方式決定 kruskal重構樹 建樹 模仿kruskal的過程,先將邊權排序 排序方式決定何種性質接下來說明 依次遍歷每條邊 若該邊連...
學習筆記 Kruskal重構樹
kruskal 求最值生成樹時需要通過邊合併兩個之前不相連的連通塊 這時候通過建立虛點表示兩點之間有連邊,同時將邊的資訊記錄到虛點上 所以如果查詢原圖上的兩點間路徑上的極值,可以考慮維護重構樹路徑上點權的資訊 大概長成這樣子,變數名還是比較大眾化的 nodes n for int i 1 i m i...