在無向圖中,邊權和最小的滿足邊權和大於等於最小生成樹邊權和的生成樹如何求解?
先求出最小生成樹,設其權值和為 \(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 ...