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

UPDATE(20180805):重新看自己的博客,大部分内容还是接受了,但看到这一篇还是不能忍了。。。当年讲的还是太含糊了,怕是本身也没搞得太清楚。但本着基本保持博文原貌的原则,所以我觉得可能重开一篇会更好。链接附上:https://www.cnblogs.com/jinkun113/p/9427825.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算法一个意思了,但是正如江哥所说,这个是需要设置反向弧使流量可以顺利流走。找出当前增广路的最小流量,到汇点后将本增广路的所有子路减去该流量,且所有反向弧增加该流量。如图所示:
 
// 原图已经丢失,无法进行迁移
 
代码如下:
UPDATE(20180805):全新的代码。
#include <cstdio>
#include <cstring> #define MAXN 205
#define MAXM 205
#define INF 0x3f3f3f3f int m, n, u, v, f, q[MAXN * MAXN], h[MAXN], d[MAXN], o, ans; struct Edge {
int v, next, f;
} e[MAXM << ]; int min(int a, int b) {
return a < b ? a : b;
} void add(int u, int v, int f) {
o++, e[o] = (Edge) {v, h[u], f}, h[u] = o;
} bool BFS() {
int head = , tail = ;
q[] = , d[] = ;
while (head != tail) {
int o = q[head];
for (int x = h[o]; x; x = e[x].next) {
int v = e[x].v;
if (!d[v] && e[x].f > ) d[v] = d[o] + , q[tail++] = v;
}
head++;
}
return d[n] != ;
} int DFS(int o, int mif) {
int res = ;
if (mif <= || o == n) return mif;
for (int x = h[o]; x; x = e[x].next) {
int v = e[x].v;
if (d[v] == d[o] + ) {
int of = DFS(v, min(mif, e[x].f));
e[x].f -= of, e[x + ].f += of, mif -= of, res += of;
if (!mif) break;
}
}
return res;
} int main() {
scanf("%d %d", &m, &n);
for (int i = ; i <= m; i++) scanf("%d %d %d", &u, &v, &f), add(u, v, f), add(v, u, );
while (BFS()) ans += DFS(, INF), memset(d, , sizeof(d));
printf("%d", ans);
return ;
}
 

[无效]网络流之Dinic算法的更多相关文章

  1. [知识点]网络流之Dinic算法

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

  2. [无效]网络流之Edmond-Karp算法

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

  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. js 编译原理

    引擎:从头到尾负责整个javaScript 程序的编译过程和执行过程. 编译器: 负责语法分析以及代码的生成. 作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询, 并实施一套非常严格的 ...

  2. Ubuntu 16 PPA源管理(查询、添加、修改、删除)

    查询 在Ubuntu中,每个PPA源是单独存放在/etc/apt/sources.list.d/文件夹中的,进入到该文件夹,使用ls命令查询即可列出当前系统添加的PPA源. 添加 sudo add-a ...

  3. 【LOJ#6485】LJJ 学二项式定理(单位根反演)

    [LOJ#6485]LJJ 学二项式定理(单位根反演) 题面 LOJ 题解 显然对于\(a0,a1,a2,a3\)分开算答案. 这里以\(a0\)为例 \[\begin{aligned} Ans&am ...

  4. Java并发专栏(一)—— Process vs Thread

    一.前言 程序是代码和数据的集合,是一种静态实体.不具有代码执行和数据处理的能力,更多是一种行为的描述. 如果将程序和处理器结合,处理器将程序加载至内存,然后执行程序代码处理数据.这时就是可执行的程序 ...

  5. Vector线程安全,ArrayList非线程安全

    http://baijiahao.baidu.com/s?id=1638844080997170869&wfr=spider&for=pc Vector线程安全,ArrayList非线 ...

  6. 2019-11-29-WPF-测试触摸设备发送触摸按下和抬起不成对

    原文:2019-11-29-WPF-测试触摸设备发送触摸按下和抬起不成对 title author date CreateTime categories WPF 测试触摸设备发送触摸按下和抬起不成对 ...

  7. C语言语法教程-链表

    链表是一群结构体(称为结点)通过指针连起来.这种结构体类型,比较特殊,叫自引用结构体类型.它有一个指针指向和和结构体一样的类型,其余是数据成员. 头指针指向第一结点,尾指针一定要用空表示,这叫有头有尾 ...

  8. VUE创建播发器组件并调用

    欢迎来到我的友链小屋   首先用vue-cli创建前端项目 参考:https://www.cnblogs.com/ouyangkai/p/11549290.html 新建play.vue文件 编写pl ...

  9. python 变量作用域、闭包

    先看一个问题: 下面代码输出的结果是0,换句话说,这个fucn2虽然已经用global声明了variable1,但还是没有改变变量的值 def func1(): variable1=0 def fun ...

  10. tkinter的单选Radiobutto

    from tkinter import * def printSelection(): num = var.get() if num == 1: lab.config(text="你是男生& ...