給定乙個邊帶正權的連通無向圖g=(v,e),其中n=|v|,m=|e|,n個點從1到n依次編號,給定三個正整數u,v,和l (u≠v),假設現在加入一條邊權為l的邊(u,v),那麼需要刪掉最少多少條邊,才能夠使得這條邊既可能出現在最小生成樹上,也可能出現在最大生成樹上?
題意:在乙個圖中,問一條邊即在最小生成樹上,又在最大生成樹上需要從圖上刪掉多少條邊
在最小生成樹上,一條邊不被選擇的充要條件是什麼呢?
當比它小的邊已經將它所連線的兩點連線起來的時候,這條邊就不能被選了
最大生成樹同樣
那麼,先只考慮最小生成樹的情況
如果這條邊不在最小生成樹中,邊權比它小的邊一定聯通了這條邊所接的節點u和v
我們想要花盡量少的代價使u,v不再聯通
顯然問題轉化為了最小割
對最小生成樹做一次再對最大生成樹做一次,答案加起來就可以了
1 #include23#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的邊建出...