今天看了很多有关网络流的知识,对于网络流有了一定的认识,并且对于怎么求解最大流,怎么求解最大流的最小费用都仔细看过,知道了用到的算法,和算法步骤,对于代码模板,也进行过研读,但还没有什么了解,毕竟还没有看很多的题,也还没有实际写过代码。这个网络流最重要的是建模,所以我也看了一些关于建模的ppt和资料,感觉模型确实不好建。
对于网络流,最简单的理解,它就像是一个交通图,要从s点(源点)到t点(汇点)有很多条路径,每条路径都有最大流量限制(成为容量),问这个交通图的最大流量是多少。解决这种问题一般用增广路来做,首先用bfs或者dfs来找增广路,并且标记一下,然后再来更新每条边的流量(和容量不是一个概念),当找不到增广路的时候,那么就找到最大流了。朴素算法是EK算法,这种算法使用bfs来查找增广路,但是效率比较低,因为要不断遍历所有的边。有一种改进的算法是dinic算法,这种算法是先分层,后找增广路,分层用bfs,再用dfs来找增广路和更新流量值。对于最大流量的最小费用,就是把每条边加上权值,解法就是把EK算法的最短路径的算法来求最短路。
关于建模,一般有增广路建模法,流量平衡思想建模法,还有最小割建模法,我感觉第二种最容易理解和掌握了,其次是第一种,有关第三种,我看了那个pdf,感觉有些难懂,也可能是因为那个pdf是以论文的形式来写的,理论性比较强。流量平衡法,就是把一个v点的所有入度和出入都列举出来,然后做一个s点到v的有向边,一般要把v点拆成两个点,没有限制就在v1和v2点之间两一条容量为无穷大的边,如果有内部限制,就在两个点之间连一条有容量的边或有权值(条件的边),然后做一个v2到t点的有向边,就是所有出度条件。还有增广路建模法,就是这个问题可以分成很多阶段,每个阶段都是一条增广路,有一个条件可以使得流量增大,然后再来增加边,但是这种建模方法没有很多研究,唯一研究过的建模方法博客还是一道贪心题。至于最小割建模法,有一个文件种说了,我看了很多知识都是老师给的pdf上写到的,看来这个知识虽然晦涩难懂,看起来很慢,其实就是不是用大白话写的,还是要做一下仔细研究,其实那个pdf也看了块一半了,也没总结出一般性建模方法,看来最小割建模,不是那么的有一般性。
希望明天有更多的收获。