bzoj2561 最小生成樹 最小割

2021-08-01 19:57:51 字數 1636 閱讀 1066

time limit: 10 sec  

memory limit: 128 mb

submit: 1857  

solved: 882 [

submit][

status][

discuss]

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

submit][

status][

discuss]

home

back

分別建圖,跑最小割

玄學網路流,上限為一好像很快

#include#include#include#include#define inf 0x7fffffff

using namespace std;

const int n = 20030;

int last[n],cur[n],h[n],q[n],cnt=1,u,v,l,ans;

struct edgee[n*30];

struct dataee[n*30];

int n,m,bit[11],count[n];

void insert( int u, int v, int w )

bool bfs()

} return h[v] != -1;

}int dfs( int x, int f )

if( !used ) h[x] = -1;

return used;

}void dinic()

}templateinline void read(t &res)

int main()

read(u); read(v); read(l);

for( int i = 1; i <= m; i++ ) if( ee[i].w < l ) insert(ee[i].u,ee[i].v,1);

dinic();

memset(last,0,sizeof(last)); cnt = 1;

for( int i = 1; i <= m; i++ ) if( ee[i].w > l ) insert(ee[i].u,ee[i].v,1);

dinic();

printf("%d", ans);

return 0;

}

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