2者都有一种增广路算法。最小费用最大流在每次求一条增广路的时候,要求这条增广路耗费最小。
算法基本步骤:
1)建立容量网络和残留网络。
2)试图在残留网络中寻找一条增广路。找到则转3),反之则表示最大流以找到。
3)增广路最小的权变为这条增广路的最大容量,然后更新残留网络。转到2)。
新学会最小费用最大流算法:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
1 int expand_path(int id)
2 {
3 int i, j, change, ans = 0;
4 memset(pre, 0, sizeof(pre));
5 memset(d, 0, sizeof(d));
6 pre[s] = s;
7 do
8 {
9 change = 0;
10 for (i = 1; i <= total; i++)
11 {
12 if (pre[i])
13 {
14 for (j = 1; j <= total; j++)
15 {
16 if (g[i][j] > 0 && f[i][j] < g[i][j])
17 {
18 if (!pre[j] || d[i] + w[i][j] < d[j])
19 {
20 change = 1;
21 pre[j] = i;
22 d[j] = d[i] + w[i][j];
23 }
24 }
25 else if (g[j][i] > 0 && f[j][i] > 0)
26 if (!pre[j] || d[i] - w[j][i] < d[j])
27 {
28 change = 1;
29 pre[j] = -i;
30 d[j] = d[i] - w[j][i];
31 }
32 }
33 }
34 }
35 } while (change);
36 if (!pre[t])
37 return 0;
38 i = t;
39 ans = MAXINT;
40 while (i != s)
41 {
42 j = abs(pre[i]);
43 if (pre[i] > 0)
44 {
45 if (g[j][i] - f[j][i] < ans)
46 ans = g[j][i] - f[j][i];
47 }
48 else if (f[i][j] < ans)
49 ans = f[i][j];
50 i = j;
51
52 }
53 return ans;
54 }
求最小费用时,增广路的求法不再是随意求一条增广路,类似求出最短路径算法。
求出一条从源点到汇点耗费最少的路径。这个方法看起来也不是很难理解的。
最大流还有其他更优的算法,理解比较困难。继续学习