如題,給出乙個網路圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網路最大流和在最大流情況下的最小費用。
輸入格式:
第一行包含四個正整數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。
屠龍寶刀點選就送
#include #include#define max 50005
#define inf 0x7fffffff
void read(int &x)
struct
edge
edge[max
<<1
];bool
vis[max];
int flow[max],answer,cost,fa[max],head[max],cnt=1
,n,m,s,t,dis[max];
int min(int a,int b)
void insert(int u,int v,int w,int
l)bool spfa(int s,int
t) vis[s]=1
; dis[s]=0
; fa[s]=0
;
int que[max],l=0,r=0
; que[++r]=s;
while(l}}
}return dis[t]
}void dinic(int s,int
t) answer+=x;cost+=x*dis[t];
}}int
main()
dinic(s,t);
printf(
"%d %d\n
",answer,cost);
return0;
}
洛谷 P3381 模板 最小費用最大流
乙個網路圖雖然最大流確定,但達到最大流的方案並不唯一。如果對於每條邊,都加乙個費用f,表示這條邊流過單位流量的代價,求達到最大流時的最小費用,這就是最小費用最大流問題。解決方法 ek費用流或zwk費用流。這裡只講ek費用流。採用貪心的思想。我們每次增廣時都選擇費用最小的一條。這樣,因為最大流是確定的...
洛谷 P3381 模板 最小費用最大流
題目鏈結 mcmf 最小費用最大流 由於要使用反向邊。定義乙個h i 表示從匯點到i的最短距離。對於一條邊e v,u e.cost e.cost h v h u 這樣可以保證圖中沒有負權邊的存在,這樣就可以使用dij來求最短路。每次求一條最短路,然後通過這條最短路更新最大流,直到找不出最短路為止。i...
洛谷 P3381 模板 最小費用最大流
洛谷 p3381 模板 最小費用最大流 include include include include include include include include include define maxe 50005 define maxn 5005 define inf 0x3f3f3f3f t...