码迷,mamicode.com
首页 > 其他好文 > 详细

费用流

时间:2017-10-03 20:12:39      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:cos   size   时间   表示   没有   分层图   时间复杂度   while   class   

边们增加了费用 求费用最少的最大流

在残余网络中,用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;
}

 

费用流

标签:cos   size   时间   表示   没有   分层图   时间复杂度   while   class   

原文地址:http://www.cnblogs.com/DearDongchen/p/7624325.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!