网络流(dinic算法)

网络最大流(dinic)

模型

在一张图中,给定一个源点s,给定汇点t,点之间有一些水管,每条水管有一个容量,经过此水管的水流最大不超过容量,问最大能有多少水从s流到t(s有无限多的水)。

解法

dinic算法通过不断寻找增广路的方法得到最大流。

增广路:从源点开始通过一些边到达汇点的边集称为一条增广路。

显然,通过一条增广路的水流是有最小限制的,其就等于增广路上水管最小的通过量。

通过寻找一条条增广路,每次找到后经过的边权都减去最大流量,并将答案加上最大流量,就得到了部分解。

但是部分解不一定是最优的,因为程序不存在反悔机会。比如网络流(dinic算法)

对于此图来说如果先找到的增广路是1->2->4->6,在下一次寻找中,1->3->4然后就会发现无路可走了,得出的答案就是1,实际上如果走1->2->5->6和1->3->4->6答案为2,显然更优。

所以,我们在找到一条增广路后需要将经过的路径反向建边构*悔的路径如图

网络流(dinic算法)

这是第一次增广选择1->2->4->6之后,对于经过的边反向建立反悔边,如果此时继续寻找增广路,就会选择1->3->4->2->5->6。这两条路径相结合,实际上就是走了1->2->5->6和1->3->4->6这两段。所以在寻找完增广路后反向建边,可以使答案不出问题。

但是这样的做法其实是EK算法,它会被某些特殊数据卡住。如图

网络流(dinic算法)

上一篇:Vue.JS入门学习随笔


下一篇:vue.js 初步学习