這個知識點好像咕咕咕了好長了。。趁還沒退役趕忙補一下吧。。php
講的很是簡略,十分抱歉。。html
Kruskal算法算法
必定的數據結構基礎(如主席樹)數據結構
直接bb好像不是很好講,那就從這道題入手吧。spa
在Bytemountains有$N$座山峯,每座山峯有他的高度$h_i$。htm
有些山峯之間有雙向道路相連,共$M$條路徑,每條路徑有一個困難值,這個值越大表示越難走.blog
如今有$Q$組詢問,每組詢問詢問從點$v$開始只通過困難值小於等於$x$的路徑所能到達的山峯中第$k$高的山峯,若是無解輸出$-1$get
首先,這是一張圖(你在說大實話麼)io
對於一個點來講,通過困難值小於等於$x$的路徑所能到達的點是必定的。import
可是這和生成樹有啥關係呢?
顯然,若一個點能經過一條路徑到達,那麼咱們走最小生成樹上的邊也必定能到達該節點。
這樣咱們把最小生成樹建出來,就能夠少考慮不少邊了。
然而並無什麼卵用。。
如今咱們須要作的,是找一種方法,可以維護出一個點能到達的點。
因而Kruskal重構樹就誕生了。
它的思想是這樣的:
在運行Kruskal算法的過程當中,對於兩個能夠合併的節點$(x, y)$,斷開其中的連邊,並新建一個節點$T$,把$T$向$(x, y)$連邊做爲他們的父親,同時把$(x, y)$之間的邊權當作$T$的點權
好比說
重構以後是這樣的:
這樣咱們獲得了一個新的樹,考慮它有什麼性質。
其中最重要的一條就是:一個節點能走到的節點必定在它的子樹中
而後這道題就作完了,直接dfs序+主席樹便可
固然,除了這一條以外,Kruskal重構樹還有不少有意思的性質