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

    ///最大流Dinic模板
    const int mx=1005;
    struct Eage
    {
        int u,v;
        int next,cap;
    };
    Eage eage[mx*2];
    int head[mx];
    int d[mx];
    int pos;
    int n,m;
    
    void Init()
    {
        memset(head,-1,sizeof(head));
        pos=0;
    }
    
    void add(int u,int v,int w)
    {
        eage[pos].v=v;
        eage[pos].cap=w;
        eage[pos].next=head[u];
        head[u]=pos++;
    }
    
    int bfs()
    {
        queue<int>q;
        memset(d,0,sizeof(d));
        d[1]=1;
        q.push(1);
        while (!q.empty())
        {
            int u=q.front();
            q.pop();
            for (int i=head[u];i!=-1;i=eage[i].next)
            {
                int v=eage[i].v;
                if (!d[v]&&eage[i].cap>0)
                {
                    d[v]=d[u]+1;
                    q.push(v);
                }
            }
        }
        return d[n];
    }
    
    int dfs(int u,int w)
    {
        if (u==n||w==0) return w;
        int ans=0;
        for (int i=head[u];i!=-1;i=eage[i].next)
        {
            int v=eage[i].v;
            if (d[u]==d[v]-1&&eage[i].cap>0)
            {
                int temp=dfs(v,min(w,eage[i].cap));
                if (temp<=0) continue;
                eage[i].cap-=temp;
                eage[i^1].cap+=temp;
                w-=temp;
                ans+=temp; ///改成 return temp有时候会快很多。 
            }
        }
        return ans;
    }
    
    int dinic()
    {
        int ans=0;
        while (bfs()) ans+=dfs(1,10000000);
        return ans;
    }
  • 相关阅读:
    3D照片放大展示窗口
    [NOI2015]品酒大会
    [SDOI2016]排列计数
    [SCOI2008]奖励关
    HDU4336 Card Collector
    CF540D Bad Luck Island
    [NOI2016]网格
    HDU3076 ssworld VS DDD
    [USACO10HOL]赶小猪
    CF113D Museum
  • 原文地址:https://www.cnblogs.com/pblr/p/5719633.html
Copyright © 2011-2022 走看看