P4234 最小差值生成樹

2021-10-24 18:56:50 字數 2416 閱讀 9992

題目鏈結

題目描述

給定乙個點標號從 1

11 到 n

nn 的、有 m

mm 條邊的無向圖,求邊權最大值與最小值的差值最小的生成樹。圖可能存在自環。

輸入格式

第一行有兩個整數,表示圖的點數 n

nn 和邊數 mmm。

接下來 m

mm 行,每行三個整數 u,v

,w

u, v, w

u,v,

w,表示存在一條連線 u,v

u, v

u,v 長度為 w

ww 的邊。

輸出格式

輸出一行乙個整數,表示答案。

輸入輸出樣例

輸入 #1

461

21013

1001490

23202

48034

40

輸出 #1

20
說明/提示

資料規模與約定

對於 100

%100\%

100%

的資料,保證 1≤n

≤5×1

04

1 \leq n \leq 5 \times 10^4

1≤n≤5×

104,1≤m

≤2×1

05

1 \leq m \leq 2 \times 10^5

1≤m≤2×

105 ,1≤u

,v≤n

1 \leq u, v \leq n

1≤u,v≤

n,1≤w≤

10

41 \leq w \leq 10^4

1≤w≤10

4。將邊權排序,由小到大遍歷邊。對於當前邊,如果兩端點已經連通,則刪掉兩點間最小的邊權,並新增該邊;否則新增該邊。如果當前連成一棵樹則更新答案。

#include

#define inf 0x3f3f3f3f

using

namespace std;

inline

intqr()

while

(c >=

'0'&& c <=

'9')

return f * fu;

}const

int n =

5e4+

10, m =

2e5+10;

struct lct tr[n + m]

;inline

void

upd(

int p)

inline

bool

get(

int p)

inline

void

spd(

int p)

}inline

bool

isrt

(int p)

inline

void

rot(

int p)

inline

void

pre(

int p)

inline

void

splay

(int p)

inline

void

access

(int p)

inline

void

mkrt

(int p)

inline

void

split

(int x,

int y)

inline

intfdrt

(int p)

inline

void

link

(int x,

int y)

inline

void

cut(

int x,

int y)

} l;

int n, m, ans = inf;

multiset<

int> st;

struct edge

} e[m]

;int

main()

sort

(e +

1, e +

1+ m)

;for

(int i =

1; i <= m; i++

)l.tr[n + i]

.val = e[i]

.z;for

(int i =

1, cnt =

0; i <= m; i++

)else

}printf

("%d\n"

, ans)

;return0;

}

P4234 最小差值生成樹

求最小差值生成樹 考慮先把邊從小到大排序 從大到小也可以,就是反過來而已 然後一條條邊列舉,如果兩端點還未聯通,直接聯通 如果整個圖已經聯通了,此時可以理解為列舉了邊的最大值 因為邊權從小到大排序了 最大值確定,就應該要讓最小值越大越好,又因為要在這兩個端點行成的路徑上刪掉乙個點,那麼就刪掉環上權值...

洛谷 p4234 最小差值生成樹

求最長邊與最短邊差值最小的生成樹.lct裸題.將邊按照邊權從小到大排序,產生生成樹的同時立即更新答案.如果加入一條邊的時候出現了環,把環上最小的邊去掉加入該邊.每次跑最小值即可,用lct可以較方便地維護.為什麼re了啊啊啊啊啊啊啊啊啊 include ithea myse valgulious na...

luoguP4234 最小差值生成樹

按照邊的權值從小到大排序,依次加入,並刪除能夠刪除的權值最小的一條邊,用 set 維護當前所有邊的邊權,並查集維護聯通性,lct 維護兩點間最小值和 link cut 操作即可 include define mp make pair using namespace std typedef unsig...