Luogu P3381 模板 最小費用最大流

2022-04-08 05:42:29 字數 1504 閱讀 8023

傳送門

最小費用最大流,就是在求最大流的前提下,使選出的路徑費用最小。

每條邊除了容量w外,還要記錄乙個單位流量費用co。

其實就是$dinic$的$bfs$和$spfa$同時進行,

每次更新增廣路時,保證選擇的一定是費用最小的一條路徑。

($paopo$說這個用不了當前弧優化,所以我就沒用qwq)

對於每個點,記錄以下變數:

初始化:每次將dis,fl設定為inf。將源點s壓入佇列,dis為0,vis為true。

每次彈出隊首,將vis改為false,檢查其連的每一條邊能否更新最短路,並更新上述變數。

若沒有訪問過這一點,則壓入佇列。

bool

spfa() }}

if(dis[t] == inf) return

false

;

return

true

;}

$bfs$結束後,不用$dfs$,直接從匯點t不斷尋找祖先,

將這條最短路上的每條邊的容量都減去流入匯點的流量fl[t],並更新最大流、最小費用。

void

mcmf()

maxflow +=fl[t];

mincost += fl[t]*dis[t];}}

完整**如下

#include#include

#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;

}

view code

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出發,到...