zoukankan      html  css  js  c++  java
  • 模板 最大流

    模板一:Ford-Fulkerson算法
    通过深度优先搜索寻找增广路,并且沿着它增广。
    设最大流流量为F,则Ford-Fulkerson算法最多进行F次深度优先搜索,时间复杂度为(O(F|E|))
    达到最坏复杂度的情况很少存在,虽然这个估算的时间复杂度比较高,但是Ford-Fulkerson算法在实际运行中还是比较快的。

    const int maxn=410,inf=2e9+10;
    int book[maxn];
    
    struct edge{
        int to,cap,rev;
    };
    
    vector<edge> g[maxn];
    
    void add_edge(int from,int to,int cap){
        g[from].push_back((edge){to,cap,g[to].size()});
        g[to].push_back((edge){from,0,g[from].size()-1});
    }
    
    int dfs(int v,int t,int f){
        if(v==t) return f;
        book[v]=1;
        for(int i=0;i<g[v].size();i++){
            edge &e=g[v][i];
            if(!book[e.to] && e.cap>0){
                int d=dfs(e.to,t,min(f,e.cap));
                if(d>0){
                    e.cap-=d;
                    g[e.to][e.rev].cap+=d;
                    return d;
                }
            }
        }
        return 0;
    }
    
    int max_flow(int s,int t){
        int flow=0;
        while(1){
            memset(book,0,sizeof(book));
            int f=dfs(s,t,inf);
            if(f==0) return flow;
            flow+=f;
        }
    }
    

    模板二:Dinic算法
    通过bfs不断构造层次图,寻找最短的增广路,并且沿着它增广,直到得到阻塞流。
    加入当前弧优化,时间复杂度为(O(|E||V|^2))
    Dinic算法在实际应用中的速度很快。

    const int maxn=20010,inf=2e9+10;
    int book[maxn];
    int level[maxn],iter[maxn];
    
    struct edge{
        int to,cap,rev;
    };
    
    vector<edge> g[maxn];
    
    void add_edge(int from,int to,int cap){
        g[from].push_back((edge){to,cap,g[to].size()});
        g[to].push_back((edge){from,0,g[from].size()-1});
    }
    
    void bfs(int s){
        memset(level,-1,sizeof(level));
        queue<int> q;
        level[s]=0;
        q.push(s);
        while(!q.empty()){
            int v=q.front();
            q.pop();
            int l=g[v].size();
            for(int i=0;i<l;i++){
                edge &e=g[v][i];
                if(e.cap>0 && level[e.to]<0){
                    level[e.to]=level[v]+1;
                    q.push(e.to);
                }
            }
        }
    }
    
    int dfs(int v,int t,int f){
        if(v==t) return f;
        int l=g[v].size();
        for(int &i=iter[v];i<l;i++){
            edge &e=g[v][i];
            if(e.cap>0 && level[v]<level[e.to]){
                int d=dfs(e.to,t,min(f,e.cap));
                if(d>0){
                    e.cap-=d;
                    g[e.to][e.rev].cap+=d;
                    return d;
                }
            }
        }
        return 0;
    }
    
    int max_flow(int s,int t){
        int flow=0;
        while(1){
            bfs(s);
            if(level[t]<0) return flow;
            memset(iter,0,sizeof(iter));
            int f;
            while((f=dfs(s,t,inf))>0){
                flow+=f;
            }
        }
    }
    
  • 相关阅读:
    Web存储
    JavaScript模块化
    jQuery挖源码——事件绑定
    观察者模式——JavaScript
    Node.js之网络小爬虫
    ECMAScript的严格模式
    JavaScript和jQuery的事件
    认识Ajax
    Redis之intset数据结构
    Redis之Hash数据结构
  • 原文地址:https://www.cnblogs.com/fxq1304/p/13177397.html
Copyright © 2011-2022 走看看