1. 程式人生 > >【模板】最小費用最大流(增廣路)(模板題:洛谷P3381)

【模板】最小費用最大流(增廣路)(模板題:洛谷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
輸出樣例#1:
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])。建兩次圖分別跑最小費用最大流和最大