Kruskal重構樹 學習筆記

2021-08-25 12:00:46 字數 3402 閱讀 5116

kruskal重構樹—性質

1.是乙個小/大根堆(由建樹時邊權的排序方式決定)

2.lca(u,v)的權值原圖u到v路徑上最大/小邊權的最小/大值(由建樹時邊權的排序方式決定)

kruskal重構樹—建樹

模仿kruskal的過程,先將邊權排序 (排序方式決定何種性質接下來說明)

依次遍歷每條邊

若該邊連線的兩個節點u和v不在乙個並查集內

新建乙個結點node

該點點權為這條邊的邊權

找到u,v所在並查集的根ui,

vi

u_i,v_i

ui​,vi

連邊(no

de,u

i)(n

ode,

vi

)(node,u_i)(node,v_i)

(node,

ui​)

(nod

e,vi

​)並更新並查集fa[

ui]=

node

,fa[

vi]=

node

fa[u_i]=node,fa[v_i]=node

fa[ui​

]=no

de,f

a[vi

​]=n

ode

遍歷完原圖所有邊後

我們建出來的必定是一棵樹

也就是我們要的kruskal重構樹

注意這棵樹是以最後新建的結點為根的有根樹

若原圖不連通,即建出的是乙個森林

那麼就遍歷每個節點,找到其並查集的根作為其所在樹的根

void

kruskal()

}for

(int i=

1;i<=cnt;

++i)if(

!vis[i]

)}

kruskal重構樹—應用

若我們開始時將邊權公升序排序

lca(u,v)的權值代表原圖u到v路徑上最大邊權的最小值

由於邊權越大的結點深度越小

所以在這棵樹上u到v的路徑顯然就是原圖上u到v盡量沿著邊權小的邊走

lca(u,v)顯然就是u到v路徑上深度最小的結點

反之若我們一開始將邊權降序排序

lca(u,v)的權值代表原圖u到v路徑上最小邊權的最大值

證明類似

這是對kruskal重構樹性質最簡單的應用

可以試著用這題練練手bzoj3732 network

#include

#include

#include

#include

#include

#include

using

namespace std;

intread()

while

(ss>=

'0'&&ss<=

'9')

return f*x;

}const

int maxn=

200010

;int n,m,q,cnt;

struct edgerem[maxn]

;struct nodee[maxn]

;int head[maxn]

,tot;

int ff[maxn]

,val[maxn]

;int fa[maxn]

,top[maxn]

,vis[maxn]

;int dep[maxn]

,son[maxn]

,size[maxn]

;bool

cmp(edge a,edge b)

void

add(

int u,

int v)

intfind

(int x)

void

dfs1

(int u,

int pa)

}void

dfs2

(int u,

int tp)

}void

kruskal()

}dfs1

(cnt,0)

;dfs2

(cnt,cnt);}

intlca

(int u,

int v)

if(dep[u]

)return u;

else

return v;

}int

main()

return0;

}

若我們開始時將邊權公升序排序

且kruskal重構樹是乙個大根堆

因為邊權大的邊總是後加入,所以這點不難證明

反之若我們一開始將邊權降序排序

且kruskal重構樹是乙個小根堆

這個性質最經典的應用就是

從u出發只經過邊權不超過x的邊能到達的結點

我們只要在求出邊權公升序排序的kuaskal重構樹

找到樹上深度最小的點權不超過x的結點(一般用樹上倍增)

那麼它子樹內的所有節點就是上述所求

這裡由其是大根堆的性質不難證明

一道挺毒瘤的練手題

bzoj3551 [ontak2010]peaks加強版【kruskal重構樹+主席樹+樹上倍增】題解

以及這次noi2018的毒瘤

[noi2018 d1t1]歸程【kruskal重構樹】題解

學習筆記 Kruskal重構樹

kruskal 求最值生成樹時需要通過邊合併兩個之前不相連的連通塊 這時候通過建立虛點表示兩點之間有連邊,同時將邊的資訊記錄到虛點上 所以如果查詢原圖上的兩點間路徑上的極值,可以考慮維護重構樹路徑上點權的資訊 大概長成這樣子,變數名還是比較大眾化的 nodes n for int i 1 i m i...

kruskal重構樹學習筆記

8102ioncc 中考到了,本蒟蒻不會,所以學一下。kruskal 求最小 大 生成樹,樹上求 lca kruskal 重構樹可以解決瓶頸路問題 如 noip2013 d1t3 貨車運輸,可以當做模板題來做,本文中也將此題作為例題 我們來思考一下 kruskal 求最小 大 生成樹的過程 後文中以...

Kruskal重構樹學習筆記

這裡是kruskal重構樹學習筆記。kruskal重構樹,是用於求出有關一張圖中,某點僅經過邊權 leq 某個值 v 的邊所得到的子圖的有關資訊的工具。但事實上,其應用還有更多。我們先講述其構造方法 將所有邊按照邊權遞增排序。依次列舉每一條邊。假如此時邊的兩個端點處於兩個不同集合中,按照常規krus...