傳送門
最小費用最大流,就是在求最大流的前提下,使選出的路徑費用最小。
每條邊除了容量w外,還要記錄乙個單位流量費用co。
其實就是$dinic$的$bfs$和$spfa$同時進行,
每次更新增廣路時,保證選擇的一定是費用最小的一條路徑。
($paopo$說這個用不了當前弧優化,所以我就沒用qwq)
對於每個點,記錄以下變數:
初始化:每次將dis,fl設定為inf。將源點s壓入佇列,dis為0,vis為true。
每次彈出隊首,將vis改為false,檢查其連的每一條邊能否更新最短路,並更新上述變數。
若沒有訪問過這一點,則壓入佇列。
bool$bfs$結束後,不用$dfs$,直接從匯點t不斷尋找祖先,spfa() }}
if(dis[t] == inf) return
false
;
return
true
;}
將這條最短路上的每條邊的容量都減去流入匯點的流量fl[t],並更新最大流、最小費用。
void完整**如下mcmf()
maxflow +=fl[t];
mincost += fl[t]*dis[t];}}
#include#includeview code#include
#include
#include
#define mogeko qwq
using
namespace
std;
const
int maxn = 2e5+10
;const
int inf = 0x3f3f3f3f
;int
n,m,s,t,a,b,c,d,cnt,ans;
inthead[maxn],to[maxn],nxt[maxn],w[maxn],co[maxn];
intfa[maxn],path[maxn],dis[maxn],fl[maxn];
intmincost,maxflow;
bool
vis[maxn];
void add(int x,int y,int ww,int
cc)
bool
spfa() }}
if(dis[t] == inf) return
false
;
return
true;}
void
mcmf()
maxflow +=fl[t];
mincost += fl[t]*dis[t];
}}int
main()
mcmf();
printf(
"%d %d
",maxflow,mincost);
return0;
}
luoguP3381 模板 最小費用最大流
題目描述 如題,給出乙個網路圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網路最大流和在最大流情況下的最小費用。輸入輸出格式 輸入格式 第一行包含四個正整數n m s t,分別表示點的個數 有向邊的個數 源點序號 匯點序號。接下來m行每行包含四個正整數ui vi wi fi,表示第...
luoguP3381 模板 最小費用最大流
如題,給出乙個網路圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網路最大流和在最大流情況下的最小費用。include include include include define maxn 5005 define maxm 50005 2 define inf 1000000007...
luogu P3381 模板 最小費用最大流
如題,給出乙個網路圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網路最大流和在最大流情況下的最小費用。輸入格式 第一行包含四個正整數n m s t,分別表示點的個數 有向邊的個數 源點序號 匯點序號。接下來m行每行包含四個正整數ui vi wi fi,表示第i條有向邊從ui出發,到...