Dinic 算法钩沉

最初是从《挑战程序设计竞赛》上了解到 Dinic 算法的。其中对于 Dinic 算法中的关键词——分层图(layered network,也称『层次图』)的引入的解释如下:

因为最短增广路(shortest augmenting path,SAP)的长度在增广过程中始终不会变短,所以无需每次都通过 BFS 来寻找 SAP。我们可以先进行一次 BFS,然后考虑由近距离顶点指向远距离顶点的边所组成的分层图,在上面进行 DFS 寻找 SAP。如果在分层图上找不到新的增广路了,则说明 SAP 的长度确实变长了,或不存在增广路了,于是重新通过 BFS 构造新的分层图。

关于

SAP 的长度在增广过程中始终不会变短

这一性质,《算法导论》上证明了一个比之更强的引理 (Lemma 26.7):

If the Edmonds-Karp algorithm is run on a flow network \(G=(V,E)\) with source \(s\) and sink \(t\), then for all vertices \(v \in V-\{s,t\}\), the shortest-path distance \(\delta_f(s,v)\) in the residual network \(G_f\) increases monotonically with each flow augmentation.

证明如下:

将增广前后的流分别记做 \(f\)\(f'\),用 \(\delta_{f}(u,v)\) 表示在剩余网络 \(G_f\) 上 从 \(u\)\(v\) 的距离。设 \(v\) 是增广后与 \(s\) 的距离变短了的所有顶点中距 \(s\) 最近(这里『距 \(s\) 最近』是指在 \(G_{f'}\) 中距 \(s\) 最近)的顶点,并设在 \(G_{f'}\)\(v\) 的一个前驱为 \(u\)(即 \((u,v)\in E_{f'}\)\(\delta_{f'}(s,u) < \delta_{f'}(s,v)\) )。此时可断言 \((u,v)\notin E_f\),即 \((u,v)\)\(G_{f'}\) 中新出现的弧。从而增广路经过弧 \((v,u)\) 。(注意,此引理讨论的是 EK 算法。)EK 算法总是沿着 SAP 增广,所以 \(\delta_{f}(s,v) < \delta_{f}(s,u)\) 。再结合 \(\delta_{f'}(s,u) < delta_{f'}(s,v)\)\(\delta_{f'}(s,v) < \delta_{f}(s,v)\),得 \(\delta_{f'}(s,u) < \delta_{f}(s,u)\) ,即增广后 \(u\)\(s\) 的距离也变短了,又 \(\delta_{f'}(s,u) < \delta_{f'}(s,v)\) ,从而与『\(v\) 是增广后与 \(s\) 的距离变短了的所有顶点中距 \(s\) 最近的顶点』矛盾。

类似的,可以证明在 Edmonds-Karp 算法(或者说 SAP 算法)中,每次增广后,从任一顶点 \(v\) 到汇点 \(t\) 的距离也是不减的。

posted @ 2017-07-10 14:35  Pat  阅读(276)  评论(0编辑  收藏  举报