zoukankan      html  css  js  c++  java
  • 模板

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    
    const int N=1e4+5,M=2e5+5;
    int n,m,s,t,tot=1,lnk[N],ter[M],nxt[M],val[M],dep[N],cnr[N];
    
    void add(int u,int v,int w) {
        ter[++tot]=v,nxt[tot]=lnk[u],lnk[u]=tot,val[tot]=w;
    }
    void addedge(int u,int v,int w) {
        add(u,v,w),add(v,u,0);
    }
    int bfs(int s,int t) {
        memset(dep,0,sizeof(dep));
        memcpy(cnr,lnk,sizeof(lnk));
        std::queue<int> q;
        q.push(s),dep[s]=1;
        while(!q.empty()) {
            int u=q.front(); q.pop();
            for(int i=lnk[u];i;i=nxt[i]) {
                int v=ter[i];
                if(val[i]&&!dep[v]) q.push(v),dep[v]=dep[u]+1;
            }
        }
        return dep[t];
    }
    int dfs(int u,int t,int flow) {
        if(u==t) return flow;
        int ans=0;
        for(int i=cnr[u];i&&ans<flow;i=nxt[i]) {
            cnr[u]=i;
            int v=ter[i];
            if(val[i]&&dep[v]==dep[u]+1) {
                int x=dfs(v,t,std::min(val[i],flow-ans));
                if(x) val[i]-=x,val[i^1]+=x,ans+=x;
            }
        }
        if(ans<flow) dep[u]=-1;
        return ans;
    }
    int dinic(int s,int t) {
        int ans=0;
        while(bfs(s,t)) {
            int x;
            while((x=dfs(s,t,1<<30))) ans+=x;
        }
        return ans;
    }
    int main() {
        scanf("%d%d%d%d",&n,&m,&s,&t);
        while(m--) {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            addedge(u,v,w);
        }
        printf("%d
    ",dinic(s,t));
        return 0;
    }

    http://old.orzsiyuan.com/articles/algorithm-Network-Flow-Minimum-Cut/

  • 相关阅读:
    WordPress让文本小工具支持简码
    修改WordPress后台登录地址,提高安全性
    WordPress用键盘左右方向键来查看上一篇和下一篇文章
    Git 补丁操作
    Git 标签操作
    Git 修正错误
    Git 删除操作
    Git 重命名操作
    Git 移动操作
    Git 藏匿操作
  • 原文地址:https://www.cnblogs.com/Yinku/p/10618449.html
Copyright © 2011-2022 走看看