【模板】最小費用最大流(增廣路)(模板題:洛谷P3381)
題目描述
如題,給出一個網路圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網路最大流和在最大流情況下的最小費用。
輸入輸出格式
輸入格式:第一行包含四個正整數N、M、S、T,分別表示點的個數、有向邊的個數、源點序號、匯點序號。
接下來M行每行包含四個正整數ui、vi、wi、fi,表示第i條有向邊從ui出發,到達vi,邊權為wi(即該邊最大流量為wi),單位流量的費用為fi。
輸出格式:一行,包含兩個整數,依次為最大流量和在最大流量情況下的最小費用。
輸入輸出樣例
輸入樣例#1:4 5 4 3 4 2 30 2 4 3 20 3 2 3 20 1 2 1 30 9 1 3 40 5
50 280
說明
時空限制:1000ms,128M
資料規模:對於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。
%:pragma GCC optimize(3) #include<iostream> #include<cstdio> #include<queue> using namespace std; const int MAXN=5010,MAXM=50010,INF=1e9; struct XY{int to,pre,cost,cap;}e[2*MAXM]; struct XX{int pre,f,dis;bool b;}v[MAXN]; int n,m,s,t,sz=1,MaxFlow,MinCost,xx,yy,cc,ww; int las[MAXN],xb[MAXN]; void add(int a,int b,int c,int z){ ++sz;e[sz].to=b;e[sz].cap=c;e[sz].cost=z; e[sz].pre=las[a];las[a]=sz; } int BFS(int s,int t){ queue<int> Q; for (int i=0;i<=n;++i) v[i].dis=INF,v[i].b=false,v[i].pre=-1; v[s].b=1;v[s].dis=v[s].pre=0;v[s].f=INF; Q.push(s); while (!Q.empty()){ int tmp=Q.front();v[tmp].b=false;Q.pop(); for (int i=las[tmp];i;i=e[i].pre){ int u=e[i].to; if (e[i].cap>0&&v[u].dis>v[tmp].dis+e[i].cost){ v[u].dis=v[tmp].dis+e[i].cost; v[u].pre=tmp;xb[u]=i; v[u].f=min(v[tmp].f,e[i].cap); if (!v[u].b) v[u].b=1,Q.push(u); } } } if (v[t].dis>=INF) return 0;return 1; } void MinCost_MaxFlow(int s,int t){ while (BFS(s,t)){ int k=t; while (k!=s){ e[xb[k]].cap-=v[t].f;e[xb[k]^1].cap+=v[t].f; k=v[k].pre; } MaxFlow+=v[t].f;MinCost+=v[t].f*v[t].dis; } } int main(){ scanf("%d %d %d %d",&n,&m,&s,&t); for (int i=1;i<=m;++i){ scanf("%d%d%d%d",&xx,&yy,&cc,&ww); add(xx,yy,cc,ww);add(yy,xx,0,-ww); } MinCost_MaxFlow(s,t); printf("%d %d",MaxFlow,MinCost); return 0; }
相關推薦
【模板】最小費用最大流(增廣路)(模板題:洛谷P3381)
題目描述 如題,給出一個網路圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網路最大流和在最大流情況下的最小費用。 輸入輸出格式 輸入格式: 第一行包含四個正整數N、M、S、T,分別表示點的個數、有向邊的個數、源點序號、匯點序號。 接下來M行每行包
【模板】LCA Tarjan演算法 (模板題:洛谷P3379)
題目描述 如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。 輸入輸出格式 輸入格式: 第一行包含三個正整數N、M、S,分別表示樹的結點個數、詢問的個數和樹根結點的序號。 接下來N-1行每行包含兩個正整數x、y,表示x結點和y結點之間有一條直接連線的邊
【模板】三分法 (模板題:洛谷P3382)
題目描述 如題,給出一個N次函式,保證在範圍[l,r]記憶體在一點x,使得[l,x]上單調增,[x,r]上單調減。試求出x的值。 輸入輸出格式 輸入格式: 第一行一次包含一個正整數N和兩個實數l、r,含義如題目描述所示。 第二行包含N+1個實數,從高到低依次表示該
【模板】匈牙利演算法 二分圖匹配 (模版題:洛谷P3386)
題目背景 二分圖 題目描述 給定一個二分圖,結點個數分別為n,m,邊數為e,求二分圖最大匹配數 輸入輸出格式 輸入格式: 第一行,n,m,e 第二至e+1行,每行兩個正整數u,v,表示u
[洛谷3381]【模板】最小費用最大流
main 最小費用最大流 spf 最大流模板題 rem digi span mem spfa 思路:最小費用最大流模板題。用EdmondsKarp,增廣時使用SPFA求最短路。 1 #include<queue> 2 #include<cstd
[洛谷P3381]【模板】最小費用最大流
code main sdi span printf fast tdi nbsp optimize 題目大意:給出一個網絡圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網絡最大流和在最大流情況下的最小費用。 解題思路:最小費用最大流模板。雖說此題最後兩個點
P3381 【模板】最小費用最大流
false == blog content space cost pre png 單位 P3381 【模板】最小費用最大流 題目描述 如題,給出一個網絡圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網絡最大流和在最大流情
luogo_3381【模板】最小費用最大流
int names push its als llc eof cap pty #include<bits/stdc++.h>using namespace std;#define MAXM 500010#define MAXN 5010#define INF 1
【模板】最小費用最大流
tar getchar print lin problem ron n) std mon https://www.luogu.org/problemnew/show/3381 #include <iostream> #include <cstdio
luogu3381 【模板】最小費用最大流
%d cstring void out mar -m body tmp using 每次選代價最小的流增廣 #include <iostream> #include <cstring> #include <cstdio> #include
洛谷P3381 【模板】最小費用最大流(dijstra費用流)
就是 tro fin https copy priority 而不是 ++ printf 題目描述 如題,給出一個網絡圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網絡最大流和在最大流情況下的最小費用。 輸入輸出格式 輸入格式: 第一行包含四
【luogu P3381 最小費用最大流】 模板
pty pre const truct str next eof OS return 題目鏈接:https://www.luogu.org/problemnew/show/P3381 把bfs變成spfa 1 #include <cstdio> 2
Luogu--3381 【模板】最小費用最大流
題目連結 3381 【模板】最小費用最大流 dijkstra 可能因為常數比較大 t了一個點但是 開o2之後可以輕鬆水過 dijkstra 版本 #include<bits/stdc++.h> using namespace std; #define ma
luogu P3381【模板】最小費用最大流
嘟嘟嘟 沒錯,我開始學費用流了! 做法也是比較樸素的\(spfa\)。 就是每一次以費用為權值跑一遍\(spfa\)找到一條最短路,然後把這條道全流滿,並把這一次的流量和費用累加到答案上。因此我們需要記錄路徑。 就這樣一直跑直到沒有增廣路為止,然後好像就沒了。(不難啊……) 因為每一隻找一條道,所以其實挺
【網路流】最小費用最大流(模板)
#include <bits/stdc++.h> using namespace std; const int Max=50010; const int inf=1e9; int n,m,ans1,ans2,size=1,head,tail,s,t; int f
【洛谷】3381 【模板】最小費用最大流
題目傳送門 划水啊,就是最小費用最大流的模板,只是標記一下自己會了這種演算法。 正解就是SPFA+EK,在SPFA擴充套件的過程中加入EK的判斷——這條邊的流量是否還有剩餘。 然後在所有節點都擴充套件
洛谷 P3381【模板】最小費用最大流
getc isdigit bfs queue struct 依次 就是 pre spfa 題目描述 如題,給出一個網絡圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網絡最大流和在最大流情況下的最小費用。 輸入輸出格式 輸入格式: 第一行包含四個正整數N、M
【網絡流24題】餐巾計劃問題(最小費用最大流)
open pre ++i 需求 http += cst efi pty 【網絡流24題】餐巾計劃問題(最小費用最大流) 題面 COGS 洛谷上的數據範圍更大,而且要開longlong 題解 餐巾的來源分為兩種: ①新買的 ②舊的拿去洗 所以,兩種情況分別建圖 先考慮第一種
bzoj 1927 [Sdoi2010]星際競速【最小費用最大流】
流量 source 覆蓋 tdi png code struct || 就是 果然還是不會建圖… 設\( i \)到\( j \)有通路,代價為\( w[i][j] \),瞬移到i代價為\( a[i] \),瞬移到i代價為\( a[j] \),逗號前是流量。 因為每個點只
洛谷 P4015 運輸問題 【最小費用最大流+最大費用最大流】
div add cst push sin eof namespace get main s向倉庫i連ins(s,i,a[i],0),商店向t連ins(i+m,t,b[i],0),商店和倉庫之間連ins(i,j+m,inf,c[i][j])。建兩次圖分別跑最小費用最大流和最大