這是一道模板題。
給定乙個圖,每條邊有容量和費用,使用每條邊的單位流量需要支付特定的費用。給定源點 1和匯點 n,求圖的最大流和最大流需要支付的最小費用。
第一行兩個整數n,m,表示有 n 個點 m 條邊。
從第二行開始的之後 m 行,每行四個整數si,ti,ci,wi 表示一條從 si 到 ti 的邊,容量為ci,單位流量需要支付的費用為wi。
資料保證有1≤n≤400,0≤m≤15000,wi≥0,保證輸入資料、中間結果以及答案在 32 位有符號整數範圍內。
一行兩個整數,分別表示最大流和最大流需要支付的最小費用。
在這裡給出一組輸入。例如:
8 23
2 3 2147483647 1
1 3 1 1
2 4 2147483647 2
1 4 1 2
2 8 2 0
3 5 2147483647 3
1 5 1 3
3 6 2147483647 4
1 6 1 4
3 8 2 0
3 2 2147483647 0
4 6 2147483647 5
1 6 1 5
4 7 2147483647 6
1 7 1 6
4 8 2 0
4 2 2147483647 0
5 8 0 0
5 2 2147483647 0
6 8 0 0
6 2 2147483647 0
7 8 0 0
7 2 2147483647 0
在這裡給出相應的輸出。例如:
6 24
#include #include #include #include #include #define int long long
using namespace std;
const int maxn = 1e4+10;
const int maxm = 1e5+10;
const int inf = 0x3f3f3f3f;
struct edge
edge[maxm];
int head[maxn],tol,pre[maxn],dis[maxn],n;
bool vis[maxn];
void init(int n)
void add_edge(int u,int v,int cap,int cost)
bool spfa(int s,int t)
dis[s] = 0;
vis[s] = true;
q.push(s);
while(!q.empty())}}
}if(pre[t] == -1)
return false;
return true;
}void mincostmaxflow(int s,int t)
for(int i = pre[t];i != -1;i = pre[edge[i^1].to])
flow += min;
}cout << flow << " " << cost << endl;
}signed main()
mincostmaxflow(1,n);
return 0;
}
網路流之 最小費用最大流
學習最小費用最大流前,需要學習最大流演算法。在最大流演算法中,沒有考慮邊的費用問題。在mincostmaxflow中,引入了費用的概念 cij表示邊 i,j 單位流量的費用。在滿足流量 v f 的同時,並且要求費用最少。最小費用最大流的迭代演算法 1.求出從s到t的最小費用通路 spfa 和通路的最...
最小費用流
include include define maxn 61 define maxv maxn maxn 2 1 define maxe maxv 5 define oo 2147483647 define min a,b a b b a define maxq maxe using namespa...
最小費用流
int v 頂點數 vector g max v int dist max v 最短距離 int prev max v 最短路中前驅結點對應的點 int pree max v 最短路中前驅結點對應的邊 void addedge int from,int to,int cap,int cost 求從s...