匈牙利算法的要点例如以下

  1. 从左边第 1 个顶点開始,挑选未匹配点进行搜索,寻找增广路。

    1. 假设经过一个未匹配点,说明寻找成功。更新路径信息。匹配边数 +1,停止搜索。

    2. 假设一直没有找到增广路,则不再从这个点開始搜索。其实。此时搜索后会形成一棵匈牙利树。我们能够永久性地把它从图中删去,而不影响结果。
  2. 因为找到增广路之后须要沿着路径更新匹配,所以我们须要一个结构来记录路径上的点。DFS 版本号通过函数调用隐式地使用一个栈。而 BFS 版本号使用 prev 数组。

性能比較

两个版本号的时间复杂度均为O(VE)。DFS 的长处是思路清晰、代码量少,可是性能不如 BFS。我測试了两种算法的性能。

对于稀疏图。BFS 版本号明显快于 DFS 版本号;而对于稠密图两者则不相上下。在全然随机数据 9000 个顶点 4,0000 条边时前者率先后者大约 97.6%,9000 个顶点 100,0000 条边时前者率先后者 8.6%, 而达到 500,0000 条边时 BFS 仅率先 0.85%。

补充定义和定理:

最大匹配数:最大匹配的匹配边的数目

最小点覆盖数:选取最少的点,使随意一条边至少有一个端点被选择

最大独立数:选取最多的点,使随意所选两点均不相连

最小路径覆盖数:对于一个 DAG(有向无环图)。选取最少条路径。使得每一个顶点属于且仅属于一条路径。路径长能够为 0(即单个点)。

定理1:最大匹配数 = 最小点覆盖数(这是 Konig 定理)

定理2:最大匹配数 = 最大独立数

定理3:最小路径覆盖数 = 顶点数 - 最大匹配数