zoukankan      html  css  js  c++  java
  • 网络流&费用流模板


    网络流&费用流模板##

    最大流

    
    struct edge{
        int to,val,next;
    }e[];
    int cnt_edge,last[],cur[],dis[];
    inline void add_edge(int u,int v,int w){
        e[++cnt_edge]=(edge){v,w,last[u]};last[u]=cnt_edge;
        e[++cnt_edge]=(edge){u,0,last[v]};last[v]=cnt_edge;
    }
    bool bfs(){
        queue<int> Q;
        for(int i=S;i<=T;i++) dis[i]=-1;
        Q.push(S);dis[S]=0;
        while(!Q.empty()){
            int now=Q.front();Q.pop();
            for(int i=last[now];i!=-1;i=e[i].next)
                if(e[i].val && dis[e[i].to]==-1){
                    dis[e[i].to]=dis[now]+1;
                    Q.push(e[i].to);
                }
        }
        return dis[T]!=-1;
    }
    int dfs(int u,int flow){
        if(u==T) return flow;
        int used=0;
        for(int i=cur[u];i!=-1;i=e[i].next)
            if(dis[e[i].to]==dis[u]+1){
                int tot=dfs(e[i].to,min(flow-used,e[i].val));
                e[i].val-=tot;e[i^1].val+=tot;
                if(e[i].val)cur[u]=i;
                used+=tot;
                if(used==flow) return flow;
            }
        if(!used)dis[u]=-1;
        return used;
    }
    int dinic(){
        int ans=0;
        while(bfs()){
            for(int i=S;i<=T;i++) cur[i]=last[i];
            ans+=dfs(S,inf);
        }
        return ans;
    }
    


      作者:skl_win
      出处:https://www.cnblogs.com/shaokele/
      本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    蘑菇街
    康拓展开
    CSS学习笔记
    专业名词
    专业名字
    01背包问题
    将bbr功能合入到centos7.3
    How to Identify User&Password of DataBase safely in SQL statement?
    tips for private constructor
    all Key Word of C#
  • 原文地址:https://www.cnblogs.com/shaokele/p/9888670.html
Copyright © 2011-2022 走看看