zoukankan      html  css  js  c++  java
  • 白书上的Dinic模板

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <map>
    #include <set>
    
    using namespace std;
    
    const int maxn=1111;
    const int maxm=1111111;
    const int INF=1e9;
    
    struct Edge{
        int from,to,cap,flow;
    };
    
    struct Dinic{
        int n,m,s,t;
        vector<Edge>edges;
        vector<int>G[maxn];
        bool vis[maxn];
        int d[maxn];
        int cur[maxn];
    
        void init(int n,int s,int t){
            this->n=n;
            this->s=s;
            this->t=t;
            for (int i=0;i<n;i++) G[i].clear();
            edges.clear();
            m=0;
        }
    
        void addedge(int from,int to,int cap){
            edges.push_back((Edge){from,to,cap,0});
            edges.push_back((Edge){to,from,0,0});
            m=edges.size();
            G[from].push_back(m-2);
            G[to].push_back(m-1);
        }
    
        bool BFS(){
            memset(vis,0,sizeof(vis));
            queue<int>que;
            que.push(s);
            d[s]=0;
            vis[s]=true;
            while (!que.empty()){
                int x=que.front();que.pop();
                for (int i=0;i<G[x].size();i++){
                    Edge& e=edges[G[x][i]];
                    if (!vis[e.to]&&e.cap>e.flow){
                        vis[e.to]=true;
                        d[e.to]=d[x]+1;
                        que.push(e.to);
                    }
                }
            }
            return vis[t];
        }
    
        int DFS(int x,int a){
            if (x==t||a==0) return a;
            int flow=0,f;
            for (int& i=cur[x];i<G[x].size();i++){
                Edge& e=edges[G[x][i]];
                if (d[x]+1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0){
                    e.flow+=f;
                    edges[G[x][i]^1].flow-=f;
                    flow+=f;
                    a-=f;
                    if (a==0) break;
                }
            }
            return flow;
        }
    
        int Maxflow(int s,int t){
            this->s=s;
            this->t=t;
            int flow=0;
            while (BFS()){
                memset(cur,0,sizeof(cur));
                flow+=DFS(s,INF);
            }
            return flow;
        }
    
    }solver;





  • 相关阅读:
    Linux中常用命令
    Shell基本介绍和使用
    linux基本介绍和使用
    Servlet基本介绍和使用
    linux系统下挂载windows共享目录
    linux下关于gz和bz2压缩格式的常用操作技巧
    linux下修改history命令保存条数
    关于在linux下清屏的几种技巧
    vim中如何引用自定义模板文件
    Linux下ps -ef和ps aux的区别及格式详解
  • 原文地址:https://www.cnblogs.com/cyendra/p/3226311.html
Copyright © 2011-2022 走看看