最大流模板(Dinic)

原创 2016年05月30日 18:01:11

想看更多模板?请点击:http://blog.csdn.net/martinue/article/category/6268283

和最小费用流模板对比着看:最小费用流模板

贴上最大流模板:

#include<stdio.h>
#include<iostream>
using   namespace std;
const   int oo=1e9;
/**oo 表示无穷大*/
const  int mm=111111111;
/**mm 表示边的最大数量,记住要是原图的两倍,在加边的时候都是双向的*/
const  int mn=999;
/**mn 表示点的最大数量*/
int node,src,dest,edge;
/**node 表示节点数,src 表示源点,dest 表示汇点,edge 统计边数*/
int ver[mm],flow[mm],next[mm];
/**ver 边指向的节点,flow 边的容量 ,next 链表的下一条边*/
int head[mn],work[mn],dis[mn],q[mn];
void prepare(int _node, int _src,int _dest)
{
    node=_node,src=_src,dest=_dest;
    for(int i=0; i<node; ++i)head[i]=-1;
    edge=0;
}
/**增加一条 u 到 v 容量为 c 的边*/
void addedge( int u,  int v,  int c)
{
    ver[edge]=v,flow[edge]=c,next[edge]=head[u],head[u]=edge++;
    ver[edge]=u,flow[edge]=0,next[edge]=head[v],head[v]=edge++;
}
/**广搜计算出每个点与源点的最短距离,如果不能到达汇点说明算法结束*/
bool Dinic_bfs()
{
    int i,u,v,l,r=0;
    for(i=0; i<node; ++i)dis[i]=-1;
    dis[q[r++]=src]=0;
    for(l=0; l<r; ++l)
        for(i=head[u=q[l]]; i>=0; i=next[i])
            if(flow[i]&&dis[v=ver[i]]<0)
            {
                /**这条边必须有剩余容量*/
                dis[q[r++]=v]=dis[u]+1;
                if(v==dest)  return 1;
            }
    return 0;
}
/**寻找可行流的增广路算法,按节点的距离来找,加快速度*/
int Dinic_dfs(  int u, int exp)
{
    if(u==dest)  return exp;
    /**work 是临时链表头,这里用 i 引用它,这样寻找过的边不再寻找*/
    for(  int &i=work[u],v,tmp; i>=0; i=next[i])
        if(flow[i]&&dis[v=ver[i]]==dis[u]+1&&(tmp=Dinic_dfs(v,min(exp,flow[i])))>0)
        {
            flow[i]-=tmp;
            flow[i^1]+=tmp;
            /**正反向边容量改变*/
            return tmp;
        }
    return 0;
}

int Dinic_flow()
{
    int i,ret=0,delta;
    while(Dinic_bfs())
    {
        for(i=0; i<node; ++i)work[i]=head[i];
        while(delta=Dinic_dfs(src,oo))ret+=delta;
    }
    return ret;
}

版权声明:本文为博主原创文章,若转载请注明转载地址http://blog.csdn.net/martinue。

网络流24题 题解 (部分) 更新中

网络流24题 慢慢来
  • QAEAWAA
  • QAEAWAA
  • 2017年02月03日 16:32
  • 175

魔术球问题(网络24题,三)

魔术球问题 题目链接:Click Here~ 算法分析:     跟第二题一样也是最短路径覆盖。但是我感觉这题比上一题难想一点,首先是在如何建图上遇到了麻烦。一开始我就没想到过用枚举的方法。...

Dinic 二分图最大匹配最大流解法(来自lixiyi学姐的模板

模板

最大流 dinic算法 模板

dinic算法在EK算法的基础上增加了分层图的概念,根据从s到各个点的最短距离的不同,把整个图分层。寻找的增广路要求满足所有的点分别属于不同的层,且若增广路为s,P1,P2…Pk,t,点v在分层图中的...

最大流的理解以及dinic模板 poj1273

增广路以及残留网络的定义不再赘述了。算导上说的很清楚,证明也有,看懂了就知道怎么求最大流了。 而算导上提到的FF方法以及ek算法的伪代码中都是将流与残留容量分开储存,其实代码实现的时候我们只需存正反...

POJ-1273-Drainage Ditches(最大流)dinic实现 后续模板待补充

Sample Input 5 4 1 2 40 1 4 20 2 4 20 2 3 30 3 4 10 Sample Output 50 #include #include #i...

最大流 dinic算法模板

算法思想:1 bfs构造残量层次图2 dfs沿着层次的残量图找增广路3 当前弧优化,用cur[u]保存u访问到第几条边,相当于记忆化,下次就不用从u的第一条边开始#include #include #...

ACM 最大流 dinic 模板

最大流的应用实在是太广泛了 几个比较有用的定理: 最大流=最小割 二分图最大匹配=二分图最小点覆盖(最大流) 二分图的匹配直接用最大流好了。 下面是个很喜欢的dinic模板,顺便用这个版过掉...

[模板]最大流(Edmonds_Karp/Dinic算法(以poj1273为例

点这个链接学习,比较简单易懂,虽然实际比赛并不用,但是因为其他代码较之更复杂,所以先理解这个算法! 代码奉上: #include #include #include #include /* i...

poj1273 Drainage Ditches(最大流EKarp+Dinic+模板总结)

http://poj.org/problem?id=1273 题意:农夫的田野每次一到下雨就会被淹没,这让他很苦恼。于是修了好多渠沟,编号为1作为池塘,编号为n作为小溪,求从池塘到小溪的最大排水量。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最大流模板(Dinic)
举报原因:
原因补充:

(最多只允许输入30个字)