bzoj2561 最小生成樹

2021-12-29 22:18:14 字數 1650 閱讀 5444

description

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

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

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

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

資料保證圖中沒有自環。

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

3 23 2 1

1 2 3

1 2 2

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

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

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

2012國家集訓隊round 1 day1

最小割的應用

對於某一條邊,如果邊權小於它的邊能使其兩個端點連通,則這條邊一定不會出現在最小生成樹中。最大生成樹同理。

所以問題轉化為,刪去最少的邊,使小於該邊權的邊不能使兩端點連通、大於該邊權的邊也不能使兩端點連通。

我們只需要分別建圖求最小割,並對兩次結果取和。

#include

#include

#include

#include

#include

#include

#include

#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

#define ll long long

#define pa pair

#define maxn 20005

#define maxm 200005

#define inf 1000000000

using namespace std;

int n,m,s,t,w,ans=0,cnt;

int head[maxn],cur[maxn],dis[maxn];

struct edge_type

e[maxm*2];

struct edge

a[maxm];

inline int read()

while (ch>='0'&&ch<='9')

return x*f;

}inline void add_edge(int x,int y,int v)

;head[x]=cnt;

e[++cnt]=(edge_type);head[y]=cnt;

}inline bool bfs()

} return false;

}inline int dfs(int x,int f)

} if (!sum) dis[x]=-1;

return sum;

}inline void dinic()

}inline bool cmp(edge a1,edge a2)

dinic();

printf("%d\n",ans);

}

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