樹 kruskal重構樹

2022-07-22 04:51:10 字數 2190 閱讀 8651

學習資料:hwzzyr的部落格

定義?:

在kruskal演算法的過程中,把最小生成樹的邊權改為點權而構建的二叉樹。

拋開kruskal演算法來講,對原圖(注意,不止對樹,圖也可以)的邊集進行排序,然後將邊當成節點建樹。

性質:構造:

\(code:\)

void buildkt()

); for(int i=1,up=n+m;i<=up;i++)pre[i]=i;

num=n;

for(int i=1,fu,fv;i<=m;i++)

}}

例題:

1,牛客 水災

題意:\(1\le n,m\le5\times10^5,\;1\le\sum_^qk_i\le10^6,\;1\le k_i\le n,\;1\le u,v\le n,\;1\le w_i\le 10^9\)

題解說:

最優情況可以是刪去所有任意被詢問兩點的 \(⁡\operatorname\)。

由於我們只需要知道這些被刪去的點中點權的最大值,所以我們只用知道把被詢問點按照 dfs 序排序。

那麼每組詢問的答案就是排序後所有被詢問相鄰兩點的所有 \(\operatorname\) 的點權的最大值。

非相鄰兩個被詢問點的 \(\operatorname\) 一定是某相鄰兩點的 \(\operatorname\) 的父親,它的點權一定不是最大的,所以就不需要查詢。

\(code:\)

//#pragma gcc optimize("-o2")

#include#define reg register

#define ll long long

using namespace std;

const int mod=1e9+7;

const int inf=0x3f3f3f3f;

const int maxn=2e6+5;

const double ep=1e-12;

templatevoid read(t&x)

int pre[maxn];

int find(int x)

struct ee[maxn];

int n,m;

struct egeg[maxn];

int head[maxn],cnt;

inline void add(int u,int v);head[u]=cnt;}

int num,val[maxn];

void buildkt()

); for(int i=1,up=n+m;i<=up;i++)pre[i]=i;

num=n;

for(int i=1,fu,fv;i<=m;i++)

}}int depth[maxn<<2],id[maxn],rid[maxn<<2],dfcnt,st[maxn<<2][25];

void dfs(int u,int d)

}int lg[maxn<<2];

void init()

int pre[maxn];

int find(int x)

struct ee[maxn];

int n,m;

ll dis[maxn];

struct p

};vectorp[maxn];

priority_queueque;

void dij()

); p poi;

while(!que.empty()));}

}// for(int i=1;i<=n;i++)printf("%lld ",dis[i]);putchar(10);

}int num,val[maxn],fa[maxn][25];

void buildkt()

); for(int i=1,up=n+m;i<=up;i++)pre[i]=i;

num=n;

for(int i=1,fu,fv;i<=m;i++)

}}void init()

int main()

; p[u].push_back();p[v].push_back();

}dij();buildkt();init();

read(q);read(k);read(s);

while(q--)

}}

新技能get!

Kruskal重構樹入門

這個知識點好像咕咕咕了好長了。趁還沒退役趕緊補一下吧。講的非常簡略,十分抱歉。kruskal演算法 一定的資料結構基礎 如主席樹 直接bb好像不是很好講,那就從這道題入手吧。在bytemountains有 n 座山峰,每座山峰有他的高度 h i 有些山峰之間有雙向道路相連,共 m 條路徑,每條路徑有...

Kruskal重構樹 學習筆記

kruskal重構樹 性質 1.是乙個小 大根堆 由建樹時邊權的排序方式決定 2.lca u,v 的權值是原圖u到v路徑上最大 小邊權的最小 大值 由建樹時邊權的排序方式決定 kruskal重構樹 建樹 模仿kruskal的過程,先將邊權排序 排序方式決定何種性質接下來說明 依次遍歷每條邊 若該邊連...

學習筆記 Kruskal重構樹

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