最小费用最大流(模板)

struct MCFC
{
    struct edge
    {
        int to,next;
        ll cap,flow,cost;
    } e[maxm];
    int N;
    int head[maxn],tot,pre[maxn];
    ll dis[maxn];
    bool vis[maxn];
    void init(int n)
    {
        N=n;
        tot=1;
        for(int i=0; i<=n; ++i) head[i]=0;
    }
    void add(int u,int v,ll cap,ll cost)
    {
        tot++;
        e[tot].to=v;
        e[tot].cap=cap;
        e[tot].flow=0;
        e[tot].cost=cost;
        e[tot].next=head[u];
        head[u]=tot;

        tot++;
        e[tot].to=u;
        e[tot].cap=0;
        e[tot].flow=0;
        e[tot].cost=-cost;
        e[tot].next=head[v];
        head[v]=tot;
    }
    bool spfa(int s,int t)
    {
        queue<int>q;
        for(int i=0; i<=N; ++i)
        {
            dis[i]=inf;
            vis[i]=0;
            pre[i]=-1;
        }
        dis[s]=0;
        vis[s]=1;
        q.push(s);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=0;
            for(int i=head[u]; i; i=e[i].next)
            {
                int v=e[i].to;
                if(e[i].cap>e[i].flow&&dis[v]>dis[u]+e[i].cost)
                {
                    dis[v]=dis[u]+e[i].cost;
                    pre[v]=i;
                    if(!vis[v])
                    {
                        vis[v]=1;
                        q.push(v);
                    }
                }
            }
        }
        if(pre[t]==-1) return false;
        return true;
    }
    ll mcfc(int s,int t)
    {
        ll maxflow=0;
        ll mincost=0;
        while(spfa(s,t))
        {
            ll minn=inf;//增广流量
            ll cost=0;//增广路最小花费
            for(int i=pre[t]; i!=-1; i=pre[e[i^1].to])
            {
                if(minn>e[i].cap-e[i].flow)
                    minn=e[i].cap-e[i].flow;
            }
            for(int i=pre[t]; i!=-1; i=pre[e[i^1].to])
            {
                e[i].flow+=minn;
                e[i^1].flow-=minn;
                cost+=e[i].cost;
            }
            mincost+=cost*minn;
            maxflow+=minn;
        }
        return maxflow;
    }
}st;
原文地址:https://www.cnblogs.com/nublity/p/11437113.html