zoukankan      html  css  js  c++  java
  • 图论——最小费用最大流

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <queue>
    #include <cstring>
    #define INF 0x3f3f3f3f
    using namespace std;
    struct edge{
       int from,to,cap,cost,next;
    }E[600000];
    int tot;
    int head[300];int dis[300];
    int inq[300];
    int pre[300];
    int maxf = 0;
    void addedge(int a,int b,int cap, int cost)
    {
        E[tot].from = a;
        E[tot].to = b;
        E[tot].cap = cap;
        E[tot].cost = cost;
        E[tot].next = head[a];
        head[a] = tot++;
        //反向边
        E[tot].from = b;
        E[tot].to = a;
        E[tot].cap = 0;
        E[tot].cost = -cost;
        E[tot].next = head[b];
        head[b] = tot++;
    }
    void init()
    {
        memset(E,0,sizeof(E));
        memset(head,-1,sizeof(head));
        memset(pre,-1,sizeof(pre));
        tot = 0;
        maxf = 0;
    }bool spfa(int b , int e)
    {
        memset(dis,INF,sizeof(dis));
        memset(inq,false,sizeof(inq));
        memset(pre, -1, sizeof(pre));
        queue<int> q;
        dis[b] = 0;
        inq[b] = true;
        q.push(b);
        while (!q.empty())
        {
            int u = q.front() ;q.pop();
            for (int i = head[u]; i!=-1 ; i = E[i].next)
            {
                int v = E[i].to;
                if (E[i].cap && dis[v] > dis[u] + E[i].cost)
                {
                    dis[v] = dis[u] + E[i].cost;
                    pre[v] = i;
                    if (!inq[v])
                        {q.push(v);inq[v] = true;}
                }
            }
            inq[u] = false;
        }
        return pre[e]!=-1;
    }
    int MCMF(int b ,int e)
    {
        int ANS = 0;
        while (spfa(b,e))
        {
    
            int minf = INF;
            for (int i = e ; i!=b ; i = E[pre[i]].from)
            {
                minf = min(minf , E[pre[i]].cap);
            }
            for (int i = e ; i!=b ; i = E[pre[i]].from)
            {
                E[pre[i]].cap -= minf;
                E[pre[i]^1].cap += minf;
            }
            maxf += minf;
            ANS += (minf*dis[e]);
        }
        return ANS;
    }
    int main()
    {
            initfirst();
            init();
            MCMF(b,e);
    
    }
  • 相关阅读:
    好看的壁纸网站
    python简介
    python学习之基本语法(1)
    信息系统开发方法
    数据库连接池的使用小结
    软件版本后的字母含义
    信息系统与信息化
    软考
    实施过程中的项目管理
    mysql查SQL执行速度
  • 原文地址:https://www.cnblogs.com/HITLJR/p/5818265.html
Copyright © 2011-2022 走看看