zoukankan      html  css  js  c++  java
  • 最小费用最大流(模板)

    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;
  • 相关阅读:
    一篇文章讲清楚markdown
    webservice初体验-cxf
    IReport与web项目整合
    泛型
    观察者模式
    策略模式
    设计模式与面向对象
    JavaI/O(输入/输出)
    面向对象
    Java基础类库
  • 原文地址:https://www.cnblogs.com/nublity/p/11437113.html
Copyright © 2011-2022 走看看