Kruskal重構樹入門

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

講的很是簡略,十分抱歉。。html

前置知識

Kruskal算法算法

必定的數據結構基礎(如主席樹)數據結構

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重構樹還有不少有意思的性質

  1. 是一個二叉樹
  2. 若是是按最小生成樹創建的話是一個大根堆(important!)
  3. 任意兩個點路徑上邊權的最大值爲它們的LCA的點權

例題

[NOI2018]歸程

相關文章
相關標籤/搜索