zoukankan      html  css  js  c++  java
  • 最大流(三)—— Dinic算法

    因为没打优化,比打了优化的SAP算法慢了很多,超时了。

    #include<vector>
    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<queue>
    #define numm ch-48
    #define pd putchar(' ')
    #define pn putchar('
    ')
    #define pb push_back
    #define fi first
    #define se second
    #define fre1 freopen("1.txt","r",stdin)
    #define fre2 freopen("2.txt","w",stdout)
    using namespace std;
    template <typename T>
    void read(T &res) {
        bool flag=false;char ch;
        while(!isdigit(ch=getchar())) (ch=='-')&&(flag=true);
        for(res=numm;isdigit(ch=getchar());res=(res<<1)+(res<<3)+numm);
        flag&&(res=-res);
    }
    template <typename T>
    void write(T x) {
        if(x<0) putchar('-'),x=-x;
        if(x>9) write(x/10);
        putchar(x%10+'0');
    }
    const int maxm=8000010;     ///有反向边,边数要开两倍
    const int maxn=1000010;
    const int inf=0x3f3f3f3f;
    const int INF=0x7fffffff;
    typedef long long ll;
    struct node {   ///链式前向星
        ll c;
        int to,net;
    }e[maxm];
    int head[maxn],level[maxn],que[maxn];
    int n,cnt=0;
    void init() {
    //    cnt=0;
    //    for(int i=1;i<=n;i++)   ///单测试用例可不用
    //        level[i]=0;
        for(int i=1;i<=n;i++)
            head[i]=-1;
    }
    void add(int u,int v,ll c) {
        e[cnt].to=v;
        e[cnt].c=c;
        e[cnt].net=head[u];
        head[u]=cnt++;
    }
    bool bfs(int st,int ed) {
        int iq=0;
        for(int i=1;i<=n;i++)
            level[i]=0;
        level[st]=1;
        que[iq++]=st;
        for(int i=0;i<iq;i++) {
            int top=que[i];
            if(top == ed) return true;
            for(int k=head[top];k!=-1;k=e[k].net)
                if(!level[e[k].to]&&e[k].c) {
                    que[iq++]=e[k].to;
                    level[e[k].to]=level[top]+1;
                }
        }
        return false;
    }
    ll dfs(int now,ll max_flows,int ed) {
        if(now==ed) return max_flows;
        ll res=0;
        for(int k=head[now];k!=-1;k=e[k].net)
            if(e[k].c&&level[e[k].to]==level[now]+1) {
                ll f=dfs(e[k].to,min(max_flows-res,e[k].c),ed);
                res+=f;
                e[k].c-=f;
                e[k^1].c+=f;
                if(res == max_flows) return res;
            }
        return res;
    }
    ll Dinic(int st,int ed) {
        ll max_flows=0;
        while(bfs(st,ed)) max_flows+=dfs(st,INF,ed);
        return max_flows;
    }
    int main()
    {
        int st,m,ed;
        read(n),read(m),read(st),read(ed);
        init();
        for(int i=1;i<=m;i++) {
            int u,v;
            ll c;
            read(u),read(v),read(c);
            add(u,v,c);
            add(v,u,0);     ///建立反向边
        }
        write(Dinic(st,ed));pn;
        return 0;
    }
    ///Dinic算法
    

      

  • 相关阅读:
    java常用IO流集合用法模板
    java根据概率生成数字
    从浏览器直接转跳到APP具体页面---(魔窗)MagicWindow使用教程
    java开源即时通讯软件服务端openfire源码构建
    还在繁琐的敲MVP接口和实现类吗,教你一秒搞定。
    手把手带你走进MVP +Dagger2 + DataBinding+ Rxjava+Retrofit 的世界
    poj3666(DP+离散化)
    poj3616(LIS简单变式)
    hdoj2859(矩阵DP)
    poj1088(记忆化搜索入门题)
  • 原文地址:https://www.cnblogs.com/wuliking/p/11201239.html
Copyright © 2011-2022 走看看