zoukankan      html  css  js  c++  java
  • 网络流模板

    前言:
    自己的DINIC

    别人的DINIC

    于是决定改掉自己的DINIC。

    之前写的是栈模拟dfs

    现在参考的是《算法竞赛进阶指南》

    Code:

    #include <cstdio>
    #include <cstring>
    #include <queue>
    using namespace std;
    const int N=10010;
    const int M=200010;
    const int inf=0x3f3f3f3f;
    int min(int x,int y){return x<y?x:y;}
    int head[N],edge[M],to[M],Next[M],cnt=1;
    void add(int u,int v,int w)
    {
        Next[++cnt]=head[u];to[cnt]=v;edge[cnt]=w;head[u]=cnt;
        Next[++cnt]=head[v];to[cnt]=u;edge[cnt]=0;head[v]=cnt;
    }
    int n,m,s,t;
    void init()
    {
        scanf("%d%d%d%d",&n,&m,&s,&t);
        int u,v,w;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
        }
    }
    queue <int > q;
    int dep[N];
    bool bfs()
    {
        while(!q.empty()) q.pop();
        memset(dep,0,sizeof(dep));
        dep[s]=1;
        q.push(s);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            for(int i=head[u];i;i=Next[i])
            {
                int v=to[i];
                if(edge[i]&&!dep[v])
                {
                    dep[v]=dep[u]+1;
                    if(v==t) return 1;
                    q.push(v);
                }
            }
        }
        return 0;
    }
    int dfs(int now,int flow)
    {
        if(now==t) return flow;
        int rest=flow,k;
        for(int i=head[now];i&&rest;i=Next[i])
        {
            int v=to[i];
            if(edge[i]&&dep[v]==dep[now]+1)
            {
                k=dfs(v,min(edge[i],rest));
                if(!k) dep[v]=0;
                rest-=k;
                edge[i]-=k;
                edge[i^1]+=k;
            }
        }
        return flow-rest;
    }
    void work()
    {
        int maxflow=0,flow;
        while(bfs())
            while(flow=dfs(s,inf)) maxflow+=flow;
        printf("%d
    ",maxflow);
    }
    int main()
    {
        init();
        work();
        return 0;
    }
    
    
  • 相关阅读:
    js闭包
    mysql 创建索引
    模拟title实现提示功能
    数组的深拷贝和浅拷贝
    JavaScript总结之DOM基本操作(三)
    JavaScript总结之数组操作(二)
    JavaScript总结之字符串操作(一)
    Visual Studio Code中JavaScript开发环境的配置
    PhpStorm+PhpStudy开发环境的配置
    如何在个人网站上添加logo图标
  • 原文地址:https://www.cnblogs.com/butterflydew/p/9251103.html
Copyright © 2011-2022 走看看