网络流
最大流问题(Maximum Flow Problem)
有向有权图
给定起点s和终点t
预期:求出从s到t的最大流
ps.有些“管道”达不到其最大容量
朴素的匹配算法(Naive Algorithm):未必能找到最大流,其结果往往比最优解差一点,但是其他更好的算法都基于此算法
构建一个和原图(Original Graph)相同的新图(Residual Graph),在新图上找出一条从s到t的简单无环图(Augmenting path),可以通过例如当做无权图然后求最短路的方式
由于短板效应,这条路径上的最大流量是边权的最小值 Flow = Capacity - Residual;
然后将新图的该路径上都减少这个数字,然后按照此规则进行迭代
找不到路径时,终止程序,最大流即为减少的数字之和;某条边的流量即为上述 Flow
(算法)不漏水时,流出等于流入
由于该图是有向图,具有不可逆性,算法不能反悔,因而结果不一定是最优解
Naive求出的不一定是最大流,求出的被称为阻塞流(Blocking Flow)
阻塞流:有了这些流量,就不能增加到终点的流量了;虽然它不是最优的,但是把管道都给堵住了;最大流也是阻塞流
Ford-Fulkerson Algorithm:正确性有保障,一定能找到最大流
主要流程和朴素算法相似,但是在选择简单无环图、使此路径同时减小x之后,需要构建权值为x的反向路径;这样可以使之前选择的路径即使不好也可以撤销(构建反向路径时,不能和已有正向路径抵消。但是可以和同为反向路径的边叠加)
时间复杂度: