BZOJ 2561 最小生成樹 最大流

2022-08-22 19:12:12 字數 1627 閱讀 6496

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

題意:在乙個圖中,問一條邊即在最小生成樹上,又在最大生成樹上需要從圖上刪掉多少條邊

在最小生成樹上,一條邊不被選擇的充要條件是什麼呢?

當比它小的邊已經將它所連線的兩點連線起來的時候,這條邊就不能被選了

最大生成樹同樣

那麼,先只考慮最小生成樹的情況

如果這條邊不在最小生成樹中,邊權比它小的邊一定聯通了這條邊所接的節點u和v

我們想要花盡量少的代價使u,v不再聯通

顯然問題轉化為了最小割

對最小生成樹做一次再對最大生成樹做一次,答案加起來就可以了

1 #include2

3#define maxn 20000+5

4#define maxm 600000+5

5#define set(a,b) memset(a,(b),sizeof(a))

6#define fr(i,a,b) for(ll i=(a),_end_=(b);i<=_end_;i++)

7#define rf(i,b,a) for(ll i=(a),_end_=(b);i>=_end_;i--)

8#define fe(i,a,b) for(int i=first[(b)],_end_=(a);i!=_end_;i=s[i].next)

9#define fec(i,a,b) for(int &i=cur[(b)],_end_=(a);i!=_end_;i=s[i].next)

1011

using

namespace

std;

1213 typedef long

long

ll;14

15struct

sidess[maxm];

1920

struct

edge

25}e[maxm];

2627 queueq;

28int

h[maxn],first[maxn],cur[maxn];

29int ind=0;30

int cost=0;31

intn,m,sp,tp,p;

3233

bool

comp(edge a,edge b)

3437

38void add(int u,int v,int

c)39

4849

bool

bfs()

5061}62

return h[tp]!=-1;63

}6465int dfs(int sd,int

flow)

6676

if( !used ) h[sd]=1;77

return

used;78}

7980

void

dinic()

8187}88

89void

solve()

90107

108int

main()

109

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的邊建出...