zoukankan      html  css  js  c++  java
  • [模板] 网络最大流

    dinic算法,在二分图上就是Hopcroft-Karp算法

    #include<iostream>
    #include<cstring>
    #include<cctype>
    #include<cstdio>
    #include<queue>
    
    using namespace std;
    
    const int MAXN=100005;
    const int INF=1<<30;
    
    int n,m,s,t;
    int mxflow;
    
    inline int rd(){
        int ret=0,f=1;char c;
        while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
        while(isdigit(c))ret=ret*10+c-'0',c=getchar();
        return ret*f;
    }
    
    struct Edge{
        int next,to,w;
    }e[MAXN*10];
    int ecnt=1,head[MAXN],cur[MAXN];
    inline void add(int x,int y,int w){
        e[++ecnt].next = head[x];
        e[ecnt].to = y;
        e[ecnt].w = w;
        head[x] = ecnt;
    }
    
    int dis[MAXN];
    bool bfs(){
        queue<int> Q;
        memset(dis,0,sizeof(dis));
        Q.push(s);dis[s]=1;
        while(!Q.empty()){
            int top=Q.front();Q.pop();
            for(int i=head[top];i;i=e[i].next){
                int v=e[i].to;
                if(dis[v]||!e[i].w) continue;
                Q.push(v);dis[v]=dis[top]+1;
            }
        }
        return dis[t];
    }
    
    int dfs(int x,int val){
        if(x==t) return val;
        int used=0,tmp;
        for(int i=cur[x];i;i=e[i].next){
            int v=e[i].to;
            if(dis[v]!=dis[x]+1) continue;//
            tmp=dfs(v,min(val-used,e[i].w));
            used+=tmp;
            e[i].w-=tmp;
            e[i^1].w+=tmp;
            if(e[i].w) cur[x]=i;
            if(val==used) return val;
        }
        if(!used) dis[x]=0;
        return used;
    }
    
    void dinic(){
        while(bfs()){
            memcpy(cur,head,sizeof(head));
            mxflow+=dfs(s,INF);
        }
    }
    
    int main(){
        n=rd();m=rd();
        s=rd();t=rd();
        int x,y,w;
        for(int i=1;i<=m;i++){
            x=rd();y=rd();w=rd();
            add(x,y,w);
            add(y,x,0);
        }
        dinic();
        printf("%d
    ",mxflow);
        return 0;
    }

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247417.html

  • 相关阅读:
    【宋红康程序思想学习日记5】数组排序之冒泡法
    求割点 poj 1523
    网络流 poj 3308 最小割
    网络流最小割 POJ 3469
    网络流 POJ2112
    网络流 HDU 3605
    网络流HDU 2883
    网络流 最大流HDU 3549
    微信公众平台开发者中心服务器配置Token验证失败问题
    排列熵算法简介及c#实现
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247417.html
Copyright © 2011-2022 走看看