如題,給出乙個網路圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網路最大流和在最大流情況下的最小費用。
輸入格式:
第一行包含四個正整數n、m、s、t,分別表示點的個數、有向邊的個數、源點序號、匯點序號。
接下來m行每行包含四個正整數ui、vi、wi、fi,表示第i條有向邊從ui出發,到達vi,邊權為wi(即該邊最大流量為wi),單位流量的費用為fi。
輸出格式:
一行,包含兩個整數,依次為最大流量和在最大流量情況下的最小費用。
輸入樣例#1:
4 5 4 3輸出樣例#1:4 2 30 2
4 3 20 3
2 3 20 1
2 1 30 9
1 3 40 5
50 280時空限制:1000ms,128m
(byx:最後兩個點改成了1200ms)
資料規模:
對於30%的資料:n<=10,m<=10
對於70%的資料:n<=1000,m<=1000
對於100%的資料:n<=5000,m<=50000
樣例說明:
如圖,最優方案如下:
第一條流為4-->3,流量為20,費用為3*20=60。
第二條流為4-->2-->3,流量為20,費用為(2+1)*20=60。
第三條流為4-->2-->1-->3,流量為10,費用為(2+9+5)*10=160。
故最大流量為50,在此狀況下最小費用為60+60+160=280。
故輸出50 280。
/*最小費用最大流:
對於乙個網路,它的最大流是唯一的,最大流一定是乙個定值(即使是有多個一樣的最大值),而
在最大流一定的情況下費用卻不一定是一定的,最小費用最大流就是在最大流一定的情況下求解最
小費用。所以為了滿足最小費用我們只需要每次找小費用的增廣路即可,直到流量為最大值。所以
最只需在求增廣路時先考慮費用最小的增廣路。將弧的費用看做是路徑長度,即可轉化為求最短路
的問題了。只需要所走的最短路滿足兩個條件即可:1可增廣cap> flow,2路徑變短d[v]>d[u]+cost< u,v> */
#include#include#include#include#include#includeusing namespace std;
const int n=1e4+10;//dian
const int nn=1e5+10;//bian
const int inf=9999999;
int head[n],now=1,w[n],pre[n];
int n,m,s,t,nflow,flow,fee;
int _u,_v,_river,_mon;
bool vis[n];
struct nodee[nn];
queueq;
inline int read()
inline void add(int _u,int _v,int _river,int _mon)
int ap(int k,int v)
e[pre[k]].river-=ret;
e[pre[k]^1].river+=ret;
return ret;
}inline void mcmf()
} if(w[t]==inf)
break;
nflow=ap(t,inf);
flow+=nflow;
fee+=nflow*w[t]; }}
int main()
mcmf();
printf("%d %d\n",flow,fee);
return 0;}/*
4 5 4 3
4 2 30 2
4 3 20 3
2 3 20 1
2 1 30 9
1 3 40 5
*/
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 模板 最小費用最大流
傳送門 最小費用最大流,就是在求最大流的前提下,使選出的路徑費用最小。每條邊除了容量w外,還要記錄乙個單位流量費用co。其實就是 dinic 的 bfs 和 spfa 同時進行,每次更新增廣路時,保證選擇的一定是費用最小的一條路徑。paopo 說這個用不了當前弧優化,所以我就沒用qwq 對於每個點,...