題目鏈結
題目描述
給定乙個點標號從 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...