费用流
Posted DearDongchen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了费用流相关的知识,希望对你有一定的参考价值。
边们增加了费用 求费用最少的最大流
在残余网络中,用spfa跑费用的最短路,然后沿着这条花费最少的增广路进行增广
(表示怀疑这样做的时间复杂度会比较高 因为他甚至都没有沿着分层图上最短路去增广...不过貌似没有别的办法...)
ans表示费用
bool spfa(int st, int ed){ queue<int>Q; memset(pre, -1, sizeof pre); memset(inq, 0, sizeof inq); memset(d, inf, sizeof d); inq[st] = 1; d[st] = 0; Q.push(st); while(!Q.empty()){ int u = Q.front(); Q.pop(); inq[u] = 0; for(int i = head[u]; ~i; i = edge[i].nxt){ int v = edge[i].v, cost = edge[i].cost; if(d[v] > d[u]+cost && edge[i].w-edge[i].f){ d[v] = d[u]+cost; pre[v] = i; if(!inq[v]){ inq[v] = 1; Q.push(v); } } } } return pre[ed] != -1; } int MCMF(int st, int ed){ int flow = 0; ans = 0; while(spfa(st, ed)){ int MIN = inf; for(int i = pre[ed]; ~i; i = pre[edge[i^1].v]){ if(MIN > edge[i].w-edge[i].f) MIN = edge[i].w-edge[i].f; } for(int i = pre[ed]; ~i; i = pre[edge[i^1].v]){ edge[i].f += MIN; edge[i^1].f -= MIN; } ans += d[ed]*MIN; flow += MIN; } return flow; }
以上是关于费用流的主要内容,如果未能解决你的问题,请参考以下文章