// 此博文为迁移而来,写于2015年2月6日,不代表本人现在的观点与看法。原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrg4.html

       今天我们来谈谈网络流之Dinic算法。这种算法相比Edmond-Karp算法,更加快速,更加常用。还记得EK吗?每次为了防止流量堵塞,必须进行多次BFS/DFS,非常费时间。而Dinic大叔非常机智的发明了Dinic算法,让这个问题得以解决。
       Dinic的核心内容是:反复进行BFS绘制出层次图,和DFS进行增广。所谓的层次图就是什么呢? 从源点到当前点的最近距离,可以存储到一个数组dep中。如图所示,这张图上,dep[1]=0,dep[2]=2,dep[3]=2,dep[4]=1。
 

       而层次图有什么用呢?1、在DFS增广时,当且仅当下一个点的层次是当前点的下一层才进入下一个点;2、是用来判断源点到汇点是否还有流量可以流。如果汇点已经不再层次图上了,说明没有多余的流量可以从源点流到汇点了,这个时候就可以结束搜索而输出答案了。
       那么每进行完一次BFS,dep数组要清空。接下来的步骤就和EK算法一个意思了,但是正如江哥所说,这个是需要设置反向弧使流量可以顺利流走。找出当前增广路的最小流量,到汇点后将本增广路的所有子路减去该流量,且所有反向弧增加该流量。如图所示:
 
// 原图已经丢失,无法进行迁移
 
代码如下:
 
#include<cstdio>
#include<cstring>
 
#define MAXN 205
#define MAXM 205
#define INF 1<<30
 
struct edge
{
  int v,next,flow;
};
  
int dep[MAXN],s,t,ans,h[MAXN],u,v,flow,m,n,tot;
edge list[MAXM];
 
int min(int a,int b)
{
  return (a<b)?a:b;
}
 
void AddList(int u,int v,int flow)
{
  tot++;
  list[tot].next=h[u];
  list[tot].v=v;
  list[tot].flow=flow;
  h[u]=tot;
}
  
void init()
{
  freopen("EXMaxFlow.in","r",stdin);
  freopen("EXMaxFlow.out","w",stdout);
  scanf("%d %d",&m,&n);
  for (int i=1;i<=m;i++) 
  {
    scanf("%d %d %d",&u,&v,&flow);
    AddList(u,v,flow);
    AddList(v,u,0);
  }
  s=1; t=n;
 
int BFS()
{
  int q[MAXN*MAXN],head,tail;
  head=1; tail=2; q[1]=s; dep[s]=1;
  while (head!=tail)
  {
    for (int x=h[q[head]];x!=0;x=list[x].next)
    {
      if (dep[list[x].v]==0 && list[x].flow>0)
      {
        dep[list[x].v]=dep[q[head]]+1;
        q[tail++]=list[x].v;
      }
    }
    head++;
  }
  if (dep[t]==0) return 0;
  else return 1;
}
 
int DFS(int now,int RouteMinFlow)
{
  int OldRouteMinFlow=0;
  if (RouteMinFlow<=0 || now==t) return RouteMinFlow;
  for (int x=h[now];x!=0;x=list[x].next)
  {
    if (dep[list[x].v]==dep[now]+1)
    {
      int temp=DFS(list[x].v,min(RouteMinFlow,list[x].flow));
      list[x+1].flow+=temp;
      list[x].flow-=temp;
      RouteMinFlow-=temp;
      OldRouteMinFlow+=temp;
      if (RouteMinFlow==0) break;
    }
  } 
  return OldRouteMinFlow;
}
 
int main()
{
  init();
  while (BFS()==1) { ans+=DFS(s,INF); memset(dep,0,sizeof(dep)); }
  printf("%d",ans);
  return 0;
}

[知识点]网络流之Dinic算法的更多相关文章

  1. [无效]网络流之Dinic算法

    // 此博文为迁移而来,写于2015年2月6日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrg4.html UPDA ...

  2. [知识点]网络流之Edmond-Karp算法

    // 此博文为迁移而来,写于2015年2月2日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vr12.html     ...

  3. 网络流 之 dinic算法

    我觉得这个dinic的算法和之前的增广路法差不多 .使用BFS对残余网络进行分层,在分层时,只要进行到汇点的层次数被算出即可停止, 因为按照该DFS的规则,和汇点同层或更下一层的节点,是不可能走到汇点 ...

  4. 网络流之Dinic算法

    初学网络流.存一下Dinic板子. 复杂度O(n^2*m) UVA - 1515 Pool construction 把每个草地与 S 相连,花费为dig,每个洞与 T 相连,花费为 然后对于每个两个 ...

  5. 网络流 之 dinic 算法

    网络流指的是:网络流(network-flows)是一种类比水流的解决问题方法.(类似于水管群,有一个源点(水无限多),和一个汇点,最大流就代表这个点水管群(边集)每秒最大能送道汇点的水量) 这个怎么 ...

  6. Secret Milking Machine POJ - 2455 网络流(Dinic算法---广搜判断+深搜增广)+时间优化+二分

    题意: 第一行输入N M C ,表示从1到N有M条无向边,现在要从1走到N 走C次完全不同的路径,求最长边的最小值.下面M行是从a点到b点的距离. 建图: 题上说从两点之间可以有多条边,问的是从1~N ...

  7. 网络流(dinic算法)

    洛谷p3376 https://www.luogu.com.cn/problem/P3376 #include <iostream> #include <cstdio> #in ...

  8. 网络流最大流——dinic算法

    前言 网络流问题是一个很深奥的问题,对应也有许多很优秀的算法.但是本文只会讲述dinic算法 最近写了好多网络流的题目,想想看还是写一篇来总结一下网络流和dinic算法以免以后自己忘了... 网络流问 ...

  9. 网络流入门—用于最大流的Dinic算法

    "网络流博大精深"-sideman语 一个基本的网络流问题 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3 ...

随机推荐

  1. Pyqt 中__init__(self,parent==None) parent理解

    参考: 在PyQt中,所有class都是从QObject派生而来,QWidget对象就可以有一个parent.这种parent-child关系主要用于两个方面: 没有parent的QWidget类被认 ...

  2. 【JAVA多线程概述】

    一.多线程概述 一个进程中至少有一个线程,每一个线程都有自己运行的内容,这个内容可以称为线程要执行的任务. 不能没一个问题都使用多线程,能使用单线程解决的问题就不要使用多线程解决. 使用多线程的弊端: ...

  3. OCJP(1Z0-851) 模拟题分析(一)11

    Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有 ...

  4. angularjs 权威指南 版本 1.2.6

    1 $rootScope  run  : run 方法初始化全局的数据 ,只对全局作用域起作用 如$rootScope <script src="http://apps.bdimg.c ...

  5. 避免在ASP.NET Core中使用服务定位器模式

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:服务定位器(Service Locator)作为一种反模式,一般情况下应该避免使用,在 ...

  6. javase基础笔记2——数据类型和面向对象

    API:Application program interface  程序调用一个方法去实现一个功能 正则表达式:regex 用来匹配的 javaEE里边有三大框架 SSH struts spring ...

  7. UIPopoverController 的使用

    #import "ViewController.h" #import "RYColorSelectController.h" #import "RYM ...

  8. 【转】html、css、js文件加载顺序及执行情况

    原链接:http://www.cnblogs.com/Walker-lyl/p/5262075.html 今天看书,看到html,css,js加载执行情况,发现自己并不是真正的了解,网上搜了半小时依然 ...

  9. hdu 1030 Delta-wave

    Delta-wave Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  10. hdu 2191 多重背包

    悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...