次小生成樹

2022-02-27 09:24:04 字數 2271 閱讀 7423

在無向圖中,邊權和最小的滿足邊權和大於等於最小生成樹邊權和的生成樹

如何求解?

先求出最小生成樹,設其權值和為 \(sum\)

首先要知道,對於 \(u,v\) 兩點,他們在最小生成樹上的路徑中,權值最大值肯定要小於等於邊 \((u,v)\) 的權值(如果有的話)

因為如果他們路徑上的最大值比 \((u,v)\) 邊權大,那麼肯定就要去掉那條最大的邊,換成 \((u,v)\),這樣做一樣能保證是一顆樹,且邊權和更小

那麼,可以依次對於每條邊 \((u,v,w)\),找出 \((u,v)\) 在最小生成樹上的權值最大值,設其為 \(max_w\)

我們嘗試用 \((u,v,w)\) 來替換掉找出的那條邊權最大的邊

則可以用 \(sum-max_w+w\) 來更新答案

答案的最小值,也就是 \(\min(sum-max_w+w)\) 即為最終答案

這樣做一定能找到非嚴格次小生成樹之一

因為在所有非嚴格次小生成樹中(顯然可能有多個),一定會有乙個是由最小生成樹僅更換一條邊得來

由於上面說的,\(u,v\) 兩點,他們在最小生成樹上的路徑中,權值最大值肯定要小於等於邊 \((u,v)\) 的權值,所以可以大體的理解為 「更換的邊越多,權值和會變得越大」

當然這並不是嚴格的證明

對於如何找邊權最大的那條邊,在最小生成樹上用倍增維護即可

由於沒有題,**沒寫

在無向圖中,邊權和最小的滿足邊權和嚴格大於最小生成樹邊權和的生成樹

考慮為什麼上面個說的方法求出的次小生成樹「不嚴格」

\(u,v\) 兩點,他們在最小生成樹上的路徑中,權值最大值肯定要小於等於邊 \((u,v)\) 的權值

這句話複製了第三遍了

是小於等於,所以如果最小生成樹中,被替換掉的那條邊,和替換他的那條邊,權值相等的話,求出的次小生成樹就和最小生成樹的權值和相等

因此不嚴格

所以,只要倍增時,維護乙個最小生成樹上路徑中的最大值,同時也維護次大值

如果最大值和 \((u,v)\) 的邊權相等,那麼就用次大值更新

這樣就保證了找出的次小生成樹嚴格大於最小生成樹

題目:luogu p4180 [bjwc2010]嚴格次小生成樹,loj#10133. 「一本通 4.4 例 4」次小生成樹

另外**中有個玄學問題,題目範圍事 \(n\le 10^5\),但卡著比 \(10^5\) 多點並不能過,會在最後乙個點越界

要再開大一些,聽說是因為最後乙個點有自環,但是我把自環判掉,如果不開大陣列還是不能過

真 · 玄 學

所以就往大里開就好了

#include#include#include#include#include#include#include#define reg register

#define en std::puts("")

#define ll long long

inline int read()

while(c>='0'&&c<='9')

return y?x:-x;

}#define n 1000006

#define m 300006

int n,m;

struct datae[m];

int up[n],on_tree[n];

int fir[n],nex[2*n],to[2*n],w[2*n],tot;

int max[23][n],max2[23][n];

int deep[n],fa[23][n];

inline void add(int u,int v,int val)

inline int cmp(data aa,data aaa)

}inline int get_lca(int a,int b)

return fa[0][a];

}inline int get_max(int a,int b,int val)

return ret;

}int main()

ll sum=kruskal(),ans=2e18;

dfs(1,0);

pre();

for(reg int i=1;i<=m;i++)if(!on_tree[i])

std::printf("%lld",ans==2e18?-1:ans);

return 0;

}

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

次小生成樹

演算法引入 設g v,e,w 是連通的無向圖,t是圖g的一棵最小生成樹 如果有另一棵樹t1,滿足不存在樹t t t1 則稱t1是圖g的次小生成樹 演算法思想 鄰集的概念 由t進行一次可行交換得到的新的生成樹所組成的集合,稱為樹t的鄰集,記為n t 設t是圖g的最小生成樹,如果t1滿足 t1 min,...

次小生成樹

分類 圖論 2013 02 12 15 03 32人閱讀收藏 舉報次小生成樹 在求最小生成樹時,用陣列path i j 來表示mst中i到j最大邊權。求完後,直接列舉所有不在mst中的邊,把它加入到mst中構成一棵新的樹,且該樹有環,此環是由剛加入的邊 i,j 造成的,所以可以通過刪除path i ...