为什么写这篇文章,早在很早之前就有接触图论的知识,多多少少走了很多的弯路。
也请教了好多大牛,对于图论,这个重要的知识点,大多是理解的比较含糊不清。
有时候,好多人说,图论不就是套模板的事情吗?是的,对于一般的竞赛选手,也只是会套模板。
甚至,对于不是做acm竞赛的人来说,这些知识点,我只要知道,传入什么值,给我什么样的结果
就行了,只知其然,不知其所以然。
看了看刘汝佳的书,参考了一下,对于网络流这一部分来说,其算法本身,可以说是一门艺术。
由于水平有限,网络流的应用十分广泛,这里我介绍一下,网络流的初步。以后有了比较好的认识,再
作补充。
1、最大流问题。(Maximum-Flow)
描叙:由于网络边上有一个属性——容量,所以产生了,从起点到汇点的最大流的问题。
解法:
1、增广路定理:在残余网络上,如果存在一条可行流,那么一定可以沿着这条可行流
增广,流量增大,流量的增加量就是,这条可行流的瓶颈。
2、EK算法:就是利用这一特点,不停的在残余网络上找可行流,(手段是:BFS),直到
找不到这样的可行流,注意的是,每次找到可行流,就要更新残余网络。
3、Dinic算法:也是利用增广路定理,在EK算法上优化,怎么优化呢?就是预先将残余网络
分层(手段是:BFS),然后沿着层次图,找可行流(手段是:DFS);
2、最小割最大流定理。
很早就听说过了,最小割 = 最大流。其中的原因是值得思考的。记得hihocode上有一个题目就是求这个最小割集。
首先,为什么会有最小割 = 最大流呢?
割的定义:S,T两个集合,如果将这两个集合之间的边都删掉,整个集合就被分成了(S,T),成为
s-t割。他的容量c(s,t) 为他们之间的边的容量之和。显然可以知道c(s,t)>=f(s,t)的。
当我们找到最大流的时候,整张图,可以分成两个集合S,T,哪两个呢? a[u]>0的集合为S,a数组是可修改量
那么这两个集合有什么特点,就是,从 T 到 S 的流量为 0 ,f(S,T) = C(S,T)的,这样,和之前的 C(S,T)>=F(S,T)
相比,我们就找到了使得等号成立的解了,就是 a[u] > 0 的 S集合。这个 C 也是最小的。
3、最小费用最大流。(MCMF)
给网络流加一个属性:费用。每条边上,每通过一个单位流量的费用cost;
问题:从起点到终点,在总流量最大的前提下,总费用最小的流。
解法:
费用是每条边都要给的,不仅要找到瓶颈,还得知道单位流量需要的费用。这里我们就想到了最短路。
那么费用就是d[t]*a[t];