首页 > 其他 > 详细

最小费用流

时间:2015-04-25 18:13:54      阅读:173      评论:0      收藏:0      [点我收藏+]
 1 bool spfa(int s, int t) {
 2     queue<int> Q;
 3     Q.push(s);
 4     rst(d, inf);
 5     rst(p, -1);
 6     rst(pp, -1);
 7     d[s] = 0;
 8     vis[s] = true;
 9     while(!Q.empty()) {
10         int e = Q.front(); Q.pop();
11         vis[e] = false;
12         for(int i = head[e]; i+1; i = edge[i].next) {
13             if(edge[i].w) {
14                 int v = edge[i].v;
15                 if(d[v] > d[e] + edge[i].c) {
16                     d[v] = d[e] + edge[i].c;
17                     p[v] = e;
18                     pp[v] = i;
19                     if(!vis[v]) {
20                         Q.push(v);
21                     }
22                 }
23             }
24         }
25     }
26     if(d[t] == INF) return false;
27     return true;
28 }
29 int min_cost_flow(int s, int t) {
30     int ans_flow = 0, ans_cost = 0;
31     int u, mn;
32     while(spfa(s, t)) {
33         u = t;
34         mn = INF;
35         while(p[u] != -1) {
36             mn = min(mn, edge[pp[u]].w);
37             u = p[u];
38         }
39         u = t;
40         while(p[u] != -1) {
41             edge[pp[u]].w -= mn;
42             edge[pp[u]^1].w += mn;
43             u = p[u];
44         }
45         ans_cost += d[t] * mn;
46         ans_flow += mn;
47     }
48     return ans_cost;
49 }

 

最小费用流

原文:http://www.cnblogs.com/mitrenick/p/4456221.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!