學習資料: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...