Kruskal重構樹入門

2021-09-08 05:22:47 字數 1142 閱讀 1141

這個知識點好像咕咕咕了好長了。。趁還沒退役趕緊補一下吧。。

講的非常簡略,十分抱歉。。

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...