这个算法的复杂度和很多最大流的优化算法接近,因为都是多路增广的算法。
首先 bfs 多路增广,然后 dfs 增广每一个未匹配点。据说这样可以使增广次数从 O(|V|) 降为 O(√|V|) 。
感觉跟 dinic 的差别就是:dinic 是从源点开始增广,而 HK 是从每一个未匹配点开始增广。而在二分图中 dinic 的源点必然连向每一个前一部图的点,所以又是很像。
再者就是交错轨的思想,也就是二分图匹配中的增广路。感觉这是一种专门为此类问题所设的方法,同于 DLX 之于精确覆盖一样。
有向图的最小路径覆盖,|V| <= 200000, |E| <= 500000,0.3 s 左右跑过无压力。
下面上代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <iostream>
#include <algorithm>
typedef long long int64;
typedef unsigned int uint;
typedef unsigned long long uint64;
#define swap(a, b, t) ({t _ = (a); (a) = (b); (b) = _;})
#define MAX(a, b, t) ({t _ = (a), __ = (b); _ > __ ? _ : __;})
#define MIN(a, b, t) ({t _ = (a), __ = (b); _ < __ ? _ : __;})
#define maintype int
#define max(a, b) MAX(a, b, maintype)
#