最大流模板(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。

HDU1532 Drainage Ditches 最大流Dinic模板

Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)...
  • LuRiCheng
  • LuRiCheng
  • 2017年01月17日 00:17
  • 272

【模板】最小费用最大流

题目描述如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用。输入输出格式输入格式: 第一行包含四个正整数N、M、S、T,分别表示点...
  • w_yqts
  • w_yqts
  • 2017年07月14日 10:16
  • 88

isap最大流模板

  • 2014年03月30日 22:43
  • 2KB
  • 下载

最大流算法模板

网络流是一类应用非常广泛的算法,但它们的难度相对其他算法来说也较大。而最大流,是网络流其他算法的基础。网络流的基本概念  先来看一个实例。                               ...
  • Moon_1st
  • Moon_1st
  • 2010年02月10日 20:24
  • 3514

【最大流 模板 Dinic】POJ 1459 Power Network

Problem Description 给你n, np, nc, m。分别代表有n个点,其中np个是发电站,nc个是消费者,剩下n-np-nc个就是中转站。接下来给你m条边,每条边格式(u,v)w...
  • bbbbswbq
  • bbbbswbq
  • 2017年08月17日 09:55
  • 92

最大流Dinic模板

#include using namespace std; const int maxn=650; const int INF=0x3f3f3f3f; struct Edge{ int fro...
  • u014696011
  • u014696011
  • 2015年07月17日 19:02
  • 513

P3376 【模板】网络最大流

首先感谢(http://blog.csdn.net/x_y_q_/article/details/51999466)http://blog.csdn.net/x_y_q_/article/detail...
  • qq_36820605
  • qq_36820605
  • 2017年04月23日 08:47
  • 379

POJ 1459最大流模板

题意大家自己去网上找吧。。。 要自己建立超级源点,汇点 本弱渣直到现在才正式敢于面对网络流,,, 只是想写成自己熟悉的模板而已 //POJ1459 //Memory:1060K //Time: ...
  • qq_27765961
  • qq_27765961
  • 2016年07月25日 17:00
  • 152

最大流模板2

templateint N,typename T> struct MaxFlow { int s,t,head[N],etot,que[N],qf,qe,dis[N],cur[N]; ...
  • Laighno_J
  • Laighno_J
  • 2015年05月27日 00:03
  • 242

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

增广路以及残留网络的定义不再赘述了。算导上说的很清楚,证明也有,看懂了就知道怎么求最大流了。 而算导上提到的FF方法以及ek算法的伪代码中都是将流与残留容量分开储存,其实代码实现的时候我们只需存正反...
  • hitwhacmer1
  • hitwhacmer1
  • 2015年07月23日 11:43
  • 1323
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最大流模板(Dinic)
举报原因:
原因补充:

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