[学习笔记]网络流 Dinic算法(研究总结,网络流)

网络流是一个博大精深的OI类别

今天浅显地理解了一下网络流,做一下笔记

定义:

1.网络:是一个有向图,每个边有一个容量c(x,y),每条边也会有一个可行的流量f(x,y),这个f被称为流函数

图中有一个源点S,不断往外流水,只流不入,汇点T则相反。其他的点流入的量等于流出的量。

流/增广路:一条从S 出发,能到达T且经过的边的流函数最小值>0的路径,称为一个流/增广路

网络流:顾名思义,和水流类似,就是在一张网络上流水,每条边好似一个管道。

2.三大定律:

①容量限制:f(x,y)<=c(x,y) 每条边不能超过边的容量。这限制了网络一定有一个最大的总流量

②斜对称:f(x,y)=-f(y,x) 一条边相当于是一个正边和反边组成,从x往y流flow,相当于从y往回流-flow

这一点其实是人为定义的,原图中一般也不画出,但是相当关键,也是可以用dinic,EK等算法直接求最大流的“反悔回流”的条件

这个反边是一定要建的。不要忘了。

③流量守恒。除了源点,汇点之外,每个点流入的总流量,一定等于流出的总流量。

扫描二维码关注公众号,回复: 3084740 查看本文章

这一点也是很重要的基础,为最大流求法和模型构建提供了成立的条件。

最大流:

之前已经说了,每个点有一个流入的和流出的量。

定义,一个网络的总流量为:∑f(s,v)即从源点流出的总量。

满足三大定律的流函数有很多,其中最多的总流量称为这个网络的最大流。

算法:

①Edmonds-Karp(EK)利用bfs每次找到一条增广路增广。

(留坑,学完费用流再补)

一般能处理10^3~10^4的网络

②Dinic算法

发现EK每次最多只找到一条增广路,效率不是很高

Dinic bfs搜出分层图,dfs多路增广,效率就很高了。

放链接:Dinic算法(研究总结,网络流)

一般能处理10^4~10^5的网络。

应用:

①二分图最大匹配,S向所有左部点连边,左部点向右部点连边,右部点向T连边。边权均为1

显然,这个网络的最大流就是二分图最大匹配。

②最小割(见下)

③找到二分图的必须边和可行边(见下)

猜你喜欢

转载自www.cnblogs.com/Miracevin/p/9610823.html