Dinic—高效的网络流
算法用了层次图的概念,每个顶点u都有一个层次值 level(u),这个值就是剩余图(residual graph)中从源到该点最少要经过的边数,而层次图就是包含所有满足 level(v) = level(u) + 1 的边以及这些边两端的顶点组成的。整个算法就是不停地重建这个图,然后沿着这个图(也就是朝着 level 值为当前顶点的 level 值加1的那些顶点)走,如果走到汇点,那么就相当于找到了一条增广路径(augmenting path),然后增加流量并移除增广路径上饱和的边。算法的高效之处在于,找到增广路径之后,算法会回溯到路径上某个有可能继续增广的顶点,然后尝试从该 点的其他邻接边开始继续增广,这个过程其实就是 dfs。相对于每次从源开始 bfs,这样 dfs 的高效性毋庸置疑,想想如果那条路径长度为 10000,其中均匀分布着可以继续增广的顶点......
如果用邻接矩阵存储流网络的话,这个算法可以写得很短,但是考虑到一般图都比较稀疏,邻接矩阵太浪费空间,所以这里就使用了邻接表来存储,不过如果图的边数达到一定程度之后,比如有向完全图边数的 1/4,那么强烈建议使用邻接矩阵。