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

    不介绍原理。

    例题一:P3376 【模板】网络最大流

    模板。代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=500000;
    int beg[maxn],nex[maxn],to[maxn],w[maxn],e;
    inline void add(int x,int y,int z){
        nex[e]=beg[x];beg[x]=e;
        to[e]=y;w[e]=z;e++;
    }
    int n,m,s,t,flow,dep[maxn];
    queue<int>q;
    inline int bfs(int x,int y){
        memset(dep,0x3f,sizeof(dep));
        while(!q.empty())q.pop();
        dep[x]=0;
        q.push(x);
        while(!q.empty()){
            int t=q.front();
            q.pop();
            for(int i=beg[t];~i;i=nex[i])
                if(dep[to[i]]>n&&w[i]){
                    dep[to[i]]=dep[t]+1;
                    q.push(to[i]);
                }
        }
        return dep[y]<n;
    }
    int dfs(int x,int y,int lim){
        if(!lim||x==y)return lim;
        int ans=0;
        for(int i=beg[x];~i;i=nex[i])
            if(dep[to[i]]==dep[x]+1){
                int f=dfs(to[i],y,min(lim,w[i]));
                ans+=f;w[i]-=f;w[i^1]+=f;lim-=f;
            }
        return ans;
    }
    inline void dinic(int x,int y){
        while(bfs(x,y))flow+=dfs(x,y,2147483647);
    }
    int main(){
        memset(beg,-1,sizeof(beg));
        cin>>n>>m>>s>>t;
        int x,y,z;
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&x,&y,&z);
            add(x,y,z);
            add(y,x,0);
        }
        dinic(s,t);
        printf("%d
    ",flow);
        return 0;
    }
  • 相关阅读:
    列表
    break和continue
    第三天下午
    第二天
    简历,面试
    周三&nbsp;景安
    应届生求职优势(我的求职心…

    2013年01月02日
    Click&nbsp;and&nbsp;Drag
  • 原文地址:https://www.cnblogs.com/syzf2222/p/12342003.html
Copyright © 2011-2022 走看看