图论算法-网络最大流模板【EK;Dinic】


EK模板

每次找出增广后残量网络中的最小残量增加流量

const int inf=1e9;
int n,m,s,t;
struct node{int v,cap;};
vector<node> map[100010];
int flow[10010][10010];
int a[100010];
int pre[100010];

int EK()
{
    int maxf;//记录最大流量
    queue<int> q;
    while(1)
    {
        memset(a,0,sizeof(a));
        a[s]=inf;
        q.push(s);

        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            for(int j=0;j<map[u].size();j++)
            {
                int v=map[u][j].v;
                int cap=map[u][j].cap;
                if(!a[v]&&cap>flow[u][v])
                {
                    pre[v]=u;
                    q.push(v);
                    a[v]=min(a[u],cap-flow[u][v]);
                }
            }
        }

        if(a[t]==0)
        break;

        for(int u=t;u!=s;u=pre[u])
        {
            flow[ pre[u] ][u]+=a[t];
            flow[ u][ pre[u] ]-=a[t];
        }
        maxf+=a[t];
    }
    return  maxf;
}

int main()
{
    cin>>n>>m>>s>>t;
    for(int i=1;i<=m;i++)
    {
        int u,v,dis;
        cin>>u>>v>>dis;
        map[u].push_back((node) {v,dis });
        map[v].push_back((node) {u,0 });//**高亮**反向边一定要记得建
    }

    int ans=EK();

    cout<<ans;
    return 0;
}

Dinic模板

构造层次+阻塞流增广

const int inf=1e9;
int n,m;
int s,t;
int tot=1;
struct node{int v,f,nxt;}E[1000010];
int head[100010];
int lev[100010];//记录层次

void add(int u,int v,int cap)
{
    E[++tot].v=v;
    E[tot].nxt=head[u];
    E[tot].f=cap;
    head[u]=tot;
}

bool bfs()
{
    queue<int> q;
    memset(lev,-1,sizeof(lev));
    q.push(s);
    lev[s]=0;

    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int i=head[u];i;i=E[i].nxt)
        {
            int v=E[i].v;
            if(lev[v]==-1&&E[i].f)
            {
                lev[v]=lev[u]+1;
                if(v==t)
                return true;
                q.push(v);
            }
        }
    }
    return false;
}

int dfs(int u,int cap)
{
    if(u==t)
    return cap;

    int flow=cap;
    for(int i=head[u];i;i=E[i].nxt)
    {
        int v=E[i].v;
        if(lev[v]==lev[u]+1&&flow&&E[i].f>0)
        {
            int f=dfs(v,min(flow,E[i].f));
            flow-=f;
            E[i].f-=f;
            E[i^1].f+=f;
        }
    }
    return cap-flow;
}

int dinic()
{
    int maxf=0;

    while(bfs())//若s-t可达就不断构造层次图
    maxf+=dfs(s,inf);//s-t可达,用阻塞流增广

    return maxf;
}

int main()
{
    cin>>n>>m>>s>>t;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);
        add(v,u,0);//**高亮**反向边一定要记得建
    }

    dinic();
    cout<<maxf;
    return 0;
}

图论算法-网络最大流【EK;Dinic】的更多相关文章

  1. 网络最大流(EK)

    以前在oi中见到网络流的题都是直接跳过,由于本蒟蒻的理解能力太弱,导致网络流的学习不断推迟甚至被安排在了tarjan之后,原本计划于学习完最短路后就来学网络流的想法也随之破灭,在看完众多大佬 的博客后 ...

  2. POJ 1459 Power Network(网络最大流,dinic算法模板题)

    题意:给出n,np,nc,m,n为节点数,np为发电站数,nc为用电厂数,m为边的个数.      接下来给出m个数据(u,v)z,表示w(u,v)允许传输的最大电力为z:np个数据(u)z,表示发电 ...

  3. poj1459 Power Network --- 最大流 EK/dinic

    求从电站->调度站->消费者的最大流,给出一些边上的容量.和电站和消费者能够输入和输出的最大量. 加入一个超级源点和汇点,建边跑模板就能够了. 两个模板逗能够. #include < ...

  4. Ural1109_Conference(二分图最大匹配/匈牙利算法/网络最大流)

    解题报告 二分图第一题. 题目描写叙述: 为了參加即将召开的会议,A国派出M位代表,B国派出N位代表,(N,M<=1000) 会议召开前,选出K队代表,每对代表必须一个是A国的,一个是B国的; ...

  5. 洛谷P3376【模板】网络最大流  Dinic模板

    之前的Dinic模板照着刘汝佳写的vector然后十分鬼畜跑得奇慢无比,虽然别人这样写也没慢多少但是自己的就是令人捉急. 改成邻接表之后快了三倍,虽然还是比较慢但是自己比较满意了.虽然一开始ecnt从 ...

  6. 图论算法-最小费用最大流模板【EK;Dinic】

    图论算法-最小费用最大流模板[EK;Dinic] EK模板 const int inf=1000000000; int n,m,s,t; struct node{int v,w,c;}; vector ...

  7. 网络最大流算法—Dinic算法及优化

    前置知识 网络最大流入门 前言 Dinic在信息学奥赛中是一种最常用的求网络最大流的算法. 它凭借着思路直观,代码难度小,性能优越等优势,深受广大oier青睐 思想 $Dinic$算法属于增广路算法. ...

  8. 最大流EK和Dinic算法

    最大流EK和Dinic算法 EK算法 最朴素的求最大流的算法. 做法:不停的寻找增广路,直到找不到为止 代码如下: @Frosero #include <cstdio> #include ...

  9. 算法模板——Dinic网络最大流 2

    实现功能:同Dinic网络最大流 1 这个新的想法源于Dinic费用流算法... 在费用流算法里面,每次处理一条最短路,是通过spfa的过程中就记录下来,然后顺藤摸瓜处理一路 于是在这个里面我的最大流 ...

随机推荐

  1. Linux/Unix系统SSH远程按Backspace键删除时出现^H的处理方法

    在linux/unix系统中连接SSH远程工作时,输出字符后按Backspace键删除时,会出现^H,这对习惯了按Backspace键删除的用户来说,感觉非常别扭,虽然可以通过Ctrl+Backspa ...

  2. Aliase_小白学Python_Day0_前言

    听到有老师介绍,说你为什么不把你的学习过程保存下来,一是当做总结,二是作为分享.我想,也对.这算是我的第一个博客,本次想写写我为什么选择学习Python. 很多人都问过我一个问题,行业那么多,你为什么 ...

  3. Varnish的vcl子程序

    Varnish的VCL子程序 以下内容参考: http://book.varnish-software.com/4.0/ VCL子进程,在其中定制Varnish的行为.VCL子例程可用于:添加自定义标 ...

  4. C#总结(四)调用C++动态库

    由于公司很多底层的SDK,都是C++开发,上层的应用软件却是C# Winform程序.在实际工作的过程中,就经常碰到了C# 程序调用C++ 动态库的问题.最近一直在和C++ 打交道,C# 怎么调用C+ ...

  5. JavaScript Math(数学对象)

    Math(数学对象) Math 算术函数和常量 Math.abs( ) 计算绝对值 Math.acos( ) 计算反余弦值 Math.asin( ) 计算反正弦值 Math.atan( ) 计算反正切 ...

  6. [转]同一台Windows机器中启动多个Memcached服务

    Memcached的安装后,如果手头上只有一台机器,又想做多节点测试咋办? 这就需要在一台机器上启动多个Memcached服务了. 假设Memcached在如下目录:C:\memcached\memc ...

  7. python3 第四章 - 输入与输出

    1.输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字. print('hello, world') 输入以上代码,执行后输出: hello, world 事实上,任何基本类型都可 ...

  8. linkin大话数据结构--Collection和Iterator

    linkin大话数据结构--Collection和Iterator Java 集合就像一种容器,可以把多个对象的引用放入容器中.Java 集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系 ...

  9. HTML5 拖放(Drag 和 Drop)详解与实例

    简介 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 先点击一个小例子:在用户开始拖动 <p> 元素时执行 JavaSc ...

  10. awk中引用shell变量执行替换的脚本

    遇到问题: 现在有两个脚本,我想 将file1中的内容按file2来匹配 [root@154 home]# cat file1 3-1-1 POTV=1,POTA=0,POTP=2 1-4-76 PO ...