费用流

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;
}

 

以上是关于费用流的主要内容,如果未能解决你的问题,请参考以下文章

最小费用最大流算法

[洛谷P3381]模板最小费用最大流

模板最小费用最大流

最小费用流模板

费用流模板

POJ 2195 & HDU 1533 Going Home(最小费用最大流)