最大流
每条边上有(flow/capacity)两个数。每条边都引入一条容量为0的反向边(residual edge,初始为0/0),所得的新图叫做流图(flow graph),也叫残留图(residual graph)。增广路径(augmenting path)是指流图上从源点->汇点的剩余容量(=capacity-flow)大于0的路径。反向边的引入是为了undo“坏的”、没能算出最大流的增广路径。
Ford-Fulkerson算法不断在流图上找增广路径、并增广路径上的流。怎么增广?记路径的瓶颈流量为bottleneck,对于路径上的每条原始边增加bottleneck流量,每条反向边减少bottleneck流量。找不到增广路径时算法结束,最大流=sum(所有增广路径的bottleneck),或=sum(流入汇点的flow)。
Ford-Fulkerson只是通用的算法框架,没有指定找增广路径的方法。找增广路径,可以dfs、bfs(Edmonds-Karp)、优先选大容量的启发式(capacity scaling)、bfs+dfs(Dinic's)等。参见WilliamFiset的图论视频
最大二分匹配
变为最大流问题:添加源点s到左半边节点的容量为1的边、添加右半边节点到汇点t的容量为1的边,找最大流。
这里因为已是二分且容量为0或1,实现上可简化。用数组matchR记录找到的匹配某右边节点的左边节点,不断用dfs找匹配左边某节点的右边节点(相当于找增广路径)。