UVA1395 苗條的生成樹 Slim Span

2022-04-08 05:42:36 字數 962 閱讀 4047

傳送門

求一棵生成樹,使它的最大邊權與最小邊權之差最小。

假設已經求出了一棵最小生成樹,它的最小邊權一定是圖上所有邊中最小的;

它的最大邊也應該是相對最小的。

也就是說,不改變當前最小邊,它的邊權差只能變大,答案不可能變得更優了。

那麼想要答案更新,只可能是最小邊變大,最大邊也變大。

那麼刪去最小邊,加入比當前樹上最大的邊稍大的邊,如果圖依舊聯通,就可以檢查是否更新答案。

但是這樣...想要檢查圖是否聯通,複雜度是o(n*m)的。這樣總複雜度就是o(n*m^2)的,顯然不行。

思考一下,想刪除最小邊,不如把這條邊標記為不可用後,重新跑一邊最小生成樹。

最小生成樹的複雜度是o(nlogn),每條邊刪除一次就是o(m*nlogn)。

其實整理一下,就是列舉每一條邊作為最小邊,更新答案就可以了。

**如下

#include#include

#include

#include

#define mogeko qwq#include

using

namespace

std;

const

int maxn =1e6;

const

int inf = 0x3f3f3f3f

;int

n,m;

intans,fa[maxn];

struct

edge

} e[maxn];

int getfa(int

x) void

init()

void kruskal(int

s)

if(cnt < n-1)return

; ans = min(ans,mx-mn);

}int

main()

return0;

}

view code

uva 1395 苗條的生成樹(最小生成樹入門)

補一下圖論知識.題意 給n個點,m條邊,求所有生成樹中 邊權最大值 邊權最小值 的結果最小 思路 區間做一遍最小生成樹,每次記錄成功的左端點和右端點,維護最小值就可以了。用了kuangbin的模板 include include include include define inf 0x3fffff...

uva1395(最小瓶頸生成樹變形)

最小瓶頸生成樹 最大的邊權值在g的所有生成樹中是最小的。瓶頸生成樹的值為t中最大權值邊的權。無向圖的最小生成樹一定是瓶頸生成樹,但瓶頸生成樹不一定是最小生成樹。題意 求一顆生成樹,滿足最大邊和最小邊之差最小 思路分析 100個頂點,5000條邊,用kruskal演算法,暴力列舉從每條邊開始構造最小生...

UVa1395 最小值最小生成樹 並查集

思路 用結構體儲存一條邊的資訊 u,v,w 因為是求最小的生成樹,所以把邊排序後,從最小的邊 起點 依次列舉可以構成的生成樹 ac原始碼 include include include include using namespace std const int inf 1 30 int n,m,mi...