bzoj 2561 最小生成樹

2021-06-26 08:51:41 字數 1262 閱讀 7203

給定乙個邊帶正權的連通無向圖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。

看起來很高大上,其實是一道最小割裸題。因為u v l這條邊出現在最小生成樹和最大生成樹之中,所以我們可以跑兩遍最小割,分別把大於l使得u v聯通和小於l使得u v聯通的邊去掉。兩次去掉邊數量相加就是答案了。

#include#include#includeusing namespace std;

int head[100001];

struct map

a[400001];

int b[5001];

int edge;

int p;

int q[400001],d[400001];

inline void add(int s,int t,int f)

int s,t,l;

inline bool bfs()}}

if(d[p]>=0)

return true;

return false;

}inline int dfs(int k,int s)

}return t-s;

}inline int maxflow()

int s[200001],t[200001],l[200001];

int main()

}p=t;

int ans=0;

ans+=maxflow();

memset(a,0,sizeof(a));

memset(head,0,sizeof(head));

edge=0;

for(i=1;i<=m;i++)

{if(l[i]

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

BZOJ2561 最小生成樹

傳送門 題解 暫時不想寫題qwq 顯然,加入這條邊後,權值比它大的邊和比它小的邊都不能讓這兩個點連通。求最小割即可。蒟蒻只會isap。好久沒打isap的板子了 又及這範圍還真的過得去。include include include define maxn 20005 define maxm 4000...