bzoj 2561 最小生成樹

2021-09-29 07:14:51 字數 1757 閱讀 7793

time limit: 10 sec memory limit: 128 mb

submit: 2966 solved: 1370

[submit][status][discuss]

description

給定乙個邊帶正權的連通無向圖g=(v,e),其中n=|v|,m=|e|,n個點從1到n依次編號,給定三個正整數u,v,和l (u≠v),假設現在加入一條邊權為l的邊(u,v),那麼需要刪掉最少多少條邊,才能夠使得這條邊既可能出現在最小生成樹上,也可能出現在最大生成樹上?

input

第一行包含用空格隔開的兩個整數,分別為n和m;

接下來m行,每行包含三個正整數u,v和w表示圖g存在一條邊權為w的邊(u,v)。

最後一行包含用空格隔開的三個整數,分別為u,v,和 l;

資料保證圖中沒有自環。

output

輸出一行乙個整數表示最少需要刪掉的邊的數量。

sample input

3 23 2 1

1 2 3

1 2 2

sample output

1hint

對於20%的資料滿足n ≤ 10,m ≤ 20,l ≤ 20;

對於50%的資料滿足n ≤ 300,m ≤ 3000,l ≤ 200;

對於100%的資料滿足n ≤ 20000,m ≤ 200000,l ≤ 20000。

我們考慮無向圖,什麼時候會有考慮是否選擇某條邊作為生成樹的邊。

那就是形成了環。

然後如果是當前是對於最小生成樹,當前這條邊不在環上,那麼肯定必須選為最小生成樹上的邊。如果在環上,因為我們只把小於輸入的邊的邊加入到圖中,那麼我們現在需要破壞環,使得兩點不能到達,所以最小割即可。

ac**:

#pragma gcc optimize(2)

#include

//#define int long long

using namespace std;

const

int inf=

0x3f3f3f3f

;const

int n=

2e4+

10,m=

1e6+10;

int n,m,s,t,len,h[n]

,res;

int head[n]

,nex[m]

,to[m]

,w[m]

,tot=1;

struct nodet[n*10]

;int

cmp(node a,node b)

inline

void

ade(

int a,

int b,

int c)

inline

void

add(

int a,

int b,

int c)

inline

intbfs()

}}return h[t];}

intdfs

(int x,

int f)}if

(!fl) h[x]=-

1;return fl;

}int

dinic()

signed

main()

bzoj 2561 最小生成樹

給定乙個邊帶正權的連通無向圖g v,e 其中n v m e n個點從1到n依次編號,給定三個正整數u,v,和l u v 假設現在加入一條邊權為l的邊 u,v 那麼需要刪掉最少多少條邊,才能夠使得這條邊既可能出現在最小生成樹上,也可能出現在最大生成樹上?第一行包含用空格隔開的兩個整數,分別為n和m 接...

bzoj2561 最小生成樹

time limit 10 sec memory limit 128 mb submit 1024 solved 520 submit status discuss 給定乙個邊帶正權的連通無向圖g v,e 其中n v m e n個點從1到n依次編號,給定三個正整數u,v,和l u v 假設現在加入一...

bzoj 2561 最小生成樹

給定乙個邊帶正權的連通無向圖,現在加入一條邊權為l的邊 u,v 那麼需要刪掉最少多少條邊,才能夠使得這條邊既可能出現在最小生成樹上,也可能出現在最大生成樹上?以前看著一臉懵逼,現在好像就是那樣。容易想到,當u v存在一條路徑,上面不存在 l的邊,那麼新邊一定不在最小生成樹上,所以將所有小於l的邊建出...