網路流之最小費用流

2021-09-25 15:00:22 字數 1705 閱讀 6769

這是一道模板題。

給定乙個圖,每條邊有容量和費用,使用每條邊的單位流量需要支付特定的費用。給定源點 1和匯點 n,求圖的最大流和最大流需要支付的最小費用。

第一行兩個整數n,m,表示有 n 個點 m 條邊。

從第二行開始的之後 m 行,每行四個整數s​i​​,t​i​​,c​i​​,w​i​​ 表示一條從 s​i​​ 到 t​i​​ 的邊,容量為c​i​​,單位流量需要支付的費用為w​i​​。

資料保證有1≤n≤400,0≤m≤15000,w​i​​≥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...