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