zoukankan      html  css  js  c++  java
  • Dinic

      

    struct edge
    {
        int to,flow,next;
    };
    int head[MAXN],cnt,Dep[MAXN],cur[MAXN];
    edge Gra[MAXN*4];
    
    void addEdge(int st,int en,int val)///如果是双向边的话注意两条边都是val,单向边建立反向0边
    {
        Gra[cnt].flow=val;
        Gra[cnt].to=en;
        Gra[cnt].next=head[st];
        head[st]=cnt++;
    }
    
    void prework()
    {
        memset(head,-1,sizeof(head));
        cnt=0;
    }
    
    bool bfs()///分层次
    {
        queue<int>que;
        while(!que.empty())que.pop();
        memset(Dep,0,sizeof(Dep));
    
        Dep[St]=1;
        que.push(St);
        while(!que.empty())
        {
            int u=que.front();
            que.pop();
            for(int i=head[u];i!=-1;i=Gra[i].next)
            {
                int v=Gra[i].to;
                if(Gra[i].flow>0&&Dep[v]==0)
                    Dep[v]=Dep[u]+1,que.push(v);
            }
        }
        if(Dep[En]!=0)///是否有一条非0边通向终点
            return true;
        return false;
    }
    
    int dfs(int u,int flow)///直接增广的思想
    {
        if(u==En)
            return flow;
    
        for(int &i=cur[u];i!=-1;i=Gra[i].next)///注意&传引用,弧优化的重点
        {
            int v = Gra[i].to;
            if(Dep[v]==Dep[u]+1&&Gra[i].flow!=0)
            {
                int tmp=dfs(v,min(flow,Gra[i].flow));
                if(tmp>0)
                {
                    Gra[i].flow-=tmp;
                    Gra[i^1].flow+=tmp;///如果是双向的+变-
                    return tmp;
                }
            }
        }
        return 0;
    }
    
    int Dinic()
    {
        int ans=0;
        while(bfs())
        {
            for(int i=St;i<=En;i++)///弧优化的前置处理
                cur[i]=head[i];
            while(int tmp=dfs(St,inf))///重要的优化时间的点
                ans+=tmp;
        }
        return ans;
    }
    View Code
    more crazy more get!
  • 相关阅读:
    eslint 的 env 配置是干嘛使的?
    cookie httpOnly 打勾
    如何定制 antd 的样式(theme)
    剑指 Offer 66. 构建乘积数组
    剑指 Offer 65. 不用加减乘除做加法
    剑指 Offer 62. 圆圈中最后剩下的数字
    剑指 Offer 61. 扑克牌中的顺子
    剑指 Offer 59
    剑指 Offer 58
    剑指 Offer 58
  • 原文地址:https://www.cnblogs.com/wethura/p/8512183.html
Copyright © 2011-2022 走看看