zoukankan      html  css  js  c++  java
  • 模板之dinic

    写了个dinic,但是效率不尽人意,比ISAP慢了一倍也不止,可能还有待优化。

    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int inf=1<<30;
    void read(int &y)
    {
        y=0;char x=getchar();
        while(x<'0'||x>'9') x=getchar();
        while(x>='0'&&x<='9')
        {
            y=y*10+x-'0';
            x=getchar();
        }
    }
    int n,m,a,b,c,s,t,cnt=-1;
    int head[100005],dis[100005],f[100005];
    struct edge
    {
        int u,v,w;
    }e[200005];
    void add(int x,int y,int z)
    {
        e[++cnt].u=head[x];
        e[cnt].v=y;
        e[cnt].w=z;
        head[x]=cnt;
    }
    int bfs()
    {
        memset(dis,0,sizeof(dis));
        queue<int>q;
        q.push(s);dis[s]=1;
        while(!q.empty())
        {
            int nxt=q.front();q.pop();
            for(int i=head[nxt];i!=-1;i=e[i].u)
            {
                int tmp=e[i].v;
                if(e[i].w>0&&dis[tmp]==0)
                {
                    dis[tmp]=dis[nxt]+1;
                    q.push(tmp);
                }
            }
        }
        if(dis[t]==0) return 0;
        return 1;
    }
    int dfs(int x,int f)
    {
        if(x==t) return f;
        for(int i=head[x];i!=-1;i=e[i].u)
        {
            int nxt=e[i].v;
            if(dis[nxt]==dis[x]+1&&e[i].w!=0)
            {
                int d=dfs(nxt,min(f,e[i].w));
                if(d>0)
                {
                    e[i].w-=d;e[i^1].w+=d;
                    return d;
                }
            }
        }
        return 0;
    }
    int dinic()
    {
        int ans=0;
        while(bfs()) ans+=dfs(s,inf);
        return ans;
    }
    int main()
    {
        read(n);read(m);read(s);read(t);
        memset(head,-1,sizeof(head));
        for(int i=1;i<=m;i++)
        {
            read(a);read(b);read(c);
            add(a,b,c);
            add(b,a,0);
        }
        printf("%d",dinic());
        return 0;
    }

     补充一个优化的版本,与ISAP效率差不多

    int dfs(int x,int f)
    {
        if(x==t) return f;
        int d,tmp=0;
        for(int i=head[x];i!=-1;i=e[i].u)
        {
            int nxt=e[i].v;
            if(dis[nxt]==dis[x]+1&&e[i].w>0)
            {
                d=dfs(nxt,min(f-tmp,e[i].w));
                if(d==0) continue;
                e[i].w-=d;
                e[i^1].w+=d;
                tmp+=d;
                if(tmp==f) return tmp;
            }
        }
        if(!tmp) dis[x]=0;
        return tmp;
    }
  • 相关阅读:
    关系运算符重载
    一元运算符重载
    二元运算符重载
    重载函数和重载运算符
    Linux之文件通信
    Linux进程通信之mmap
    Linux之创建多个子进程
    内联函数
    静态成员
    this指针
  • 原文地址:https://www.cnblogs.com/zeroform/p/8318262.html
Copyright © 2011-2022 走看看