zoukankan      html  css  js  c++  java
  • 网络流最大流

    /*网络流最大流模板
    输入:
    点数n,边数m,起点s,终点t
    m条边:起点,终点,最大流量
    输出:
    最大流*/
    int ans;
    int n,m,s,t;
    struct Edge{
        int to,next,value;
    }e[maxn];int head[maxn],cntedge=1;
    inline void addedge(int fr,int to,int value){
        e[++cntedge]={to,head[fr],value};
        head[fr]=cntedge;
    }
    int dis[maxn];
    int bfs(){
        for(int i=1;i<=n;i++)dis[i]=-1;
        queue<int>q;
        dis[s]=0;q.push(s);
        while(!q.empty()){
            int u=q.front();q.pop();
            for(int i=head[u];i;i=e[i].next){
                int v=e[i].to;
                if(dis[v]==-1&&e[i].value>0){
                    dis[v]=dis[u]+1;
                    q.push(v);
                }
            }
        }
        return dis[t]!=-1;
    }
    int dfs(int u,int exp){
        if(u==t)return exp;
        int flow=0,tmp=0;
        for(int i=head[u];i;i=e[i].next){
            int v=e[i].to;
            if(dis[v]==dis[u]+1&&e[i].value>0){
                tmp=dfs(v,min(exp,e[i].value));
                if(!tmp){dis[v]=0;continue;}
                exp-=tmp;
                flow+=tmp;
                e[i].value -=tmp;
                e[i^1].value +=tmp;
                if(!exp)break;
            }
        }
        return flow;
    }
    signed main(){
        in(n);in(m);in(s);in(t);
        for(int i=1,x,y,z;i<=m;++i){
            in(x);in(y);in(z);
            addedge(x,y,z);
            addedge(y,x,-z);
        }
        while(bfs()){
            ans+=dfs(s,inf);
        }
        o(ans);putchar('
    ');
    }
    
  • 相关阅读:
    MVC,MVP和MVVM的区别
    将数组里某个属性相同的对象合并成一个数组
    Ajax的理解
    VUE如何关闭Eslint的方法
    数组去重
    vue-router传递参数的几种方式
    密码的显示和隐藏
    "校园易借查询"选题报告
    我的第一个微信好友分析
    数据库实践
  • 原文地址:https://www.cnblogs.com/yesuweiYYYY/p/13992545.html
Copyright © 2011-2022 走看看