【題目描述】
給定乙個標號為從 1 到 n的、有 m 條邊的無向圖,求邊權最大值與最小值的差值最小的生成樹。
【輸入格式】
第一行兩個數 n,m,表示圖的點和邊的數量。
第二行起 m 行,每行形如 ui, vi, wi,代表 ui到 vi 間有一條長為 wi 的無向邊。
【輸出格式】
輸出一行乙個整數,代表你的答案。
資料保證存在至少一棵生成樹。
s am
plei
nput
sample~~input
sample
inpu
t
4 6sam1 2 10
1 3 100
1 4 90
2 3 20
2 4 80
3 4 40
pleo
utpu
tsample~~output
sample
outp
ut
【題意分析】好久沒打lct了,提公升碼力。
我們先對邊權排個序,然後依次從小到大加入生成樹里。
用並查集維護連通性:如果新加的兩條邊還不在連通塊裡,就link一下,用乙個set維護現在在生成樹裡面所有的邊。link的時候在set裡面插入當前邊。
如果新加的兩條邊已經構成連通塊(已經有最小生成樹結構了),考慮貪心,將set裡面存的最小的邊刪去(因為加入的邊越來越大,而且題目要求的是最小差值,因此貪心刪去最小的邊)然後加入當前邊。
怎麼刪?lct提取鏈上資訊split(x,y),資訊就存在y裡面了,兩次cut即可。
lct裡面存的是最小邊值,並且有輔助陣列存下最小邊值所在位置。只要修改一下maintain函式,其他把lct板子打一遍就行
set內部用pair。
code:
#include
#include
#include
#include
#include
#include
#include
#define mp make_pair
#define inf 0x3f3f3f3f
#define maxn 500000
using
namespace std;
typedef pair <
int,
int> pii;
struct node edge[maxn]
;set data;
int son[maxn][2
], tmin[maxn]
, pos[maxn]
, father[maxn]
, stack[maxn]
;int val[maxn]
, f[maxn]
, cnt, tot, ans = inf, n, m;
bool rev[maxn]
;inline
int read (
)while
(isdigit (ch)
)return s * w;
}inline
void connect (
int u,
int v,
int w)
inline
bool cmp (node a, node b)
int getfather (
int x)
struct lct
inline
void maintain (
int x)
inline
void pushrev (
int x)
inline
void pushdown (
int x)
}inline
void rotate (
int x)
inline
void splay (
int x)
maintain (x);}
inline
void access (
int x)
inline
void makeroot (
int x)
inline
void split (
int x,
int y)
inline
void link (
int x,
int y)
inline
void cut (
int x,
int y)
}tree;
int main (
) sort (edge +
1, edge + m +
1, cmp)
, memset (val,
0x3f3f3f3f
,sizeof val)
;for
(register
int i =
1; i <= n; i++
) f[i]
= i;
for(
register
int i =
1; i <= m; i++
)else
} printf (
"%d\n"
, ans)
;return0;
}
P4234 最小差值生成樹
題目鏈結 題目描述 給定乙個點標號從 1 11 到 n nn 的 有 m mm 條邊的無向圖,求邊權最大值與最小值的差值最小的生成樹。圖可能存在自環。輸入格式 第一行有兩個整數,表示圖的點數 n nn 和邊數 mmm。接下來 m mm 行,每行三個整數 u,v w u,v,w u,v,w,表示存在一...
P4234 最小差值生成樹
求最小差值生成樹 考慮先把邊從小到大排序 從大到小也可以,就是反過來而已 然後一條條邊列舉,如果兩端點還未聯通,直接聯通 如果整個圖已經聯通了,此時可以理解為列舉了邊的最大值 因為邊權從小到大排序了 最大值確定,就應該要讓最小值越大越好,又因為要在這兩個端點行成的路徑上刪掉乙個點,那麼就刪掉環上權值...
luoguP4234 最小差值生成樹
按照邊的權值從小到大排序,依次加入,並刪除能夠刪除的權值最小的一條邊,用 set 維護當前所有邊的邊權,並查集維護聯通性,lct 維護兩點間最小值和 link cut 操作即可 include define mp make pair using namespace std typedef unsig...