POJ3522 最小差值生成樹 LCT

2021-09-25 19:58:11 字數 2732 閱讀 5857

【題目描述】

給定乙個標號為從 1 到 n的、有 m 條邊的無向圖,求邊權最大值與最小值的差值最小的生成樹。

【輸入格式】

第一行兩個數 n,m,表示圖的點和邊的數量。

第二行起 m 行,每行形如 ui, vi, wi,代表 ui到 vi 間有一條長為 wi 的無向邊。

【輸出格式】

輸出一行乙個整數,代表你的答案。

資料保證存在至少一棵生成樹。

s am

plei

nput

sample~~input

sample

inpu

t

4 6

1 2 10

1 3 100

1 4 90

2 3 20

2 4 80

3 4 40

sam

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...