日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ2561最小生成树——最小割

發布時間:2025/3/17 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ2561最小生成树——最小割 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

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

?

這道題和BZOJ2521差不多,只不過每條邊的流量都是$1$。因為既要求在最小生成樹中出現又要求在最大生成樹中出現,所以只要兩種情況分別跑最小割然后答案加和即可。注意題目中要求給定邊可能出現,所以只將邊權嚴格小于/大于的邊加入到圖中即可。

#include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<vector> #include<bitset> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; int head[30000]; int next[900000]; int to[900000]; int val[900000]; int tot=1; int n,m; int S,T; int ans; int x,y,z; int q[30000]; int d[30000]; int u[300000],v[300000],a[300000]; void add(int x,int y,int z) {next[++tot]=head[x];head[x]=tot;to[tot]=y;val[tot]=z;next[++tot]=head[y];head[y]=tot;to[tot]=x;val[tot]=0; } bool bfs(int S,int T) {memset(d,-1,sizeof(d));memset(q,0,sizeof(q));int l=0,r=0;q[r++]=S;d[S]=0;while(l<r){int now=q[l];l++;for(int i=head[now];i;i=next[i]){if(val[i]&&d[to[i]]==-1){d[to[i]]=d[now]+1;q[r++]=to[i];}}}return d[T]==-1?false:true; } int dfs(int x,int maxflow) {if(x==T){return maxflow;}int used=0;int nowflow;for(int i=head[x];i;i=next[i]){if(val[i]&&d[to[i]]==d[x]+1){nowflow=dfs(to[i],min(maxflow-used,val[i]));val[i]-=nowflow;val[i^1]+=nowflow;used+=nowflow;if(nowflow==maxflow){return maxflow;}}}if(used==0){d[x]=-1;}return used; } int dinic() {int res=0;while(bfs(S,T)){res+=dfs(S,0x3f3f3f3f);}return res; } int main() {scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d%d",&u[i],&v[i],&a[i]);}scanf("%d%d%d",&x,&y,&z);S=x,T=y;for(int i=1;i<=m;i++){if(a[i]<z){add(u[i],v[i],1);add(v[i],u[i],1);}}ans+=dinic();memset(head,0,sizeof(head));tot=1;for(int i=1;i<=m;i++){if(a[i]>z){add(u[i],v[i],1);add(v[i],u[i],1);}}ans+=dinic();printf("%d",ans); }

轉載于:https://www.cnblogs.com/Khada-Jhin/p/10570400.html

總結

以上是生活随笔為你收集整理的BZOJ2561最小生成树——最小割的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。