匈牙利算法(Hungarian Algorithm):用于求解二分图的最大匹配问题
一些定义:
二分图:把一个图的顶点划分为两个不相交集 U 和V ,使得每一条边都分别连接U、V中的顶点,且U或V中顶点没有边相连接。如果存在这样的划分,则此图为一个二分图。二分图的一个等价定义是:不含有「含奇数条边的环」的图。
匹配:在图论中,一个「匹配」(matching)是匹配边的集合,其中任意两条边都没有公共顶点。

匹配边:图3中1-5、4-7、3-6为一个匹配的匹配边,其他边为非匹配边;
匹配点:图3中1、4、5、7、3、6 为一个匹配的匹配点,其他顶点为未匹配点;
未匹配边:除去未匹配的边之后剩下的边
未匹配点:除去未匹配的顶点之后剩下的顶点
最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配。图 4 是一个最大匹配,它包含 4 条匹配边。
完美匹配:如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完美匹配。完美匹配必是最大匹配;
最大匹配问题:如图所示,男孩女孩之间的连线表示相互喜欢可以配对,能否让所有的男孩女孩都配对成功呢?即求解完美匹配问题;最多能促成多少对匹配呢,即求解二分图中最大匹配问题?

交替路:从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。图5中1-6、3-7、4-8为一个匹配,从未匹配点9出发,依次经过非匹配边4-9,匹配边4-8,非匹配边1-8,匹配边1-6,非匹配边2-6形成的路径为交替路;
增广路:从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发的点不算),则这条交替路称为增广路(agumenting path)。例如,图 5 中的一条增广路如图 6 所示(图中的匹配点均用红色标出);图7也是一条增光路;

增广路有一个重要特点:非匹配边比匹配边多一条。
增广路定理:从未匹配点出发,通过不停地找增光路路,不断增加匹配中的匹配边和匹配点,当找不到增广路时,达到最大匹配;
匈牙利算法正式利用了这个原理。
匈牙利算法的要点如下:
从左边第 1 个顶点开始,挑选未匹配点进行搜索,寻找增广路。
如果经过一个未匹配点,说明寻找成功。更新路径信息,匹配边数 +1,停止搜索。
如果一直没有找到增广路,则不再从这个点开始搜索。事实上,此时搜索后会形成一棵匈牙利树。我们可以永久性地把它从图中删去,而不影响结果。
由于找到增广路之后需要沿着路径更新匹配,所以我们需要一个结构来记录路径上的点。DFS 版本通过递归函数调用隐式地使用一个栈,而 BFS 版本使用 prev 数组。
使用BFS性能比DFS好。
扩展定义:
最优匹配又称为带权最大匹配,是指在带有权值边的二分图中,求一个匹配使得匹配边上的权值和最大。一般X和Y集合顶点个数相同,最优匹配也是一个完备匹配,即每个顶点都被匹配。如果个数不相等,可以通过补点加0边实现转化。一般使用KM算法解决该问题。
最小覆盖:二分图的最小覆盖分为最小顶点覆盖和最小路径覆盖:
①最小顶点覆盖是指最少的顶点数使得二分图G中的每条边都至少与其中一个点相关联,二分图的最小顶点覆盖数=二分图的最大匹配数;
②最小路径覆盖也称为最小边覆盖,是指用尽量少的不相交简单路径覆盖二分图中的所有顶点。二分图的最小路径覆盖数=|V|-二分图的最大匹配数;
最大独立集:最大独立集是指寻找一个点集,使得其中任意两点在图中无对应边。对于一般图来说,最大独立集是一个NP完全问题,对于二分图来说最大独立集=|V|-二分图的最大匹配数。如下图中黑色点即为一个最大独立集:
最小割定理:一个二分图中的最大匹配数等于这个图中的最小点覆盖数。
一些定义:
二分图:把一个图的顶点划分为两个不相交集 U 和V ,使得每一条边都分别连接U、V中的顶点,且U或V中顶点没有边相连接。如果存在这样的划分,则此图为一个二分图。二分图的一个等价定义是:不含有「含奇数条边的环」的图。
匹配:在图论中,一个「匹配」(matching)是匹配边的集合,其中任意两条边都没有公共顶点。
匹配边:图3中1-5、4-7、3-6为一个匹配的匹配边,其他边为非匹配边;
匹配点:图3中1、4、5、7、3、6 为一个匹配的匹配点,其他顶点为未匹配点;
未匹配边:除去未匹配的边之后剩下的边
未匹配点:除去未匹配的顶点之后剩下的顶点
最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配。图 4 是一个最大匹配,它包含 4 条匹配边。
完美匹配:如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完美匹配。完美匹配必是最大匹配;
最大匹配问题:如图所示,男孩女孩之间的连线表示相互喜欢可以配对,能否让所有的男孩女孩都配对成功呢?即求解完美匹配问题;最多能促成多少对匹配呢,即求解二分图中最大匹配问题?
交替路:从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。图5中1-6、3-7、4-8为一个匹配,从未匹配点9出发,依次经过非匹配边4-9,匹配边4-8,非匹配边1-8,匹配边1-6,非匹配边2-6形成的路径为交替路;
增广路:从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发的点不算),则这条交替路称为增广路(agumenting path)。例如,图 5 中的一条增广路如图 6 所示(图中的匹配点均用红色标出);图7也是一条增光路;
增广路有一个重要特点:非匹配边比匹配边多一条。
增广路定理:从未匹配点出发,通过不停地找增光路路,不断增加匹配中的匹配边和匹配点,当找不到增广路时,达到最大匹配;
匈牙利算法正式利用了这个原理。
匈牙利算法的要点如下:
从左边第 1 个顶点开始,挑选未匹配点进行搜索,寻找增广路。
如果经过一个未匹配点,说明寻找成功。更新路径信息,匹配边数 +1,停止搜索。
如果一直没有找到增广路,则不再从这个点开始搜索。事实上,此时搜索后会形成一棵匈牙利树。我们可以永久性地把它从图中删去,而不影响结果。
由于找到增广路之后需要沿着路径更新匹配,所以我们需要一个结构来记录路径上的点。DFS 版本通过递归函数调用隐式地使用一个栈,而 BFS 版本使用 prev 数组。
使用BFS性能比DFS好。
TODO
改天补充算法扩展定义:
最优匹配又称为带权最大匹配,是指在带有权值边的二分图中,求一个匹配使得匹配边上的权值和最大。一般X和Y集合顶点个数相同,最优匹配也是一个完备匹配,即每个顶点都被匹配。如果个数不相等,可以通过补点加0边实现转化。一般使用KM算法解决该问题。
最小覆盖:二分图的最小覆盖分为最小顶点覆盖和最小路径覆盖:
①最小顶点覆盖是指最少的顶点数使得二分图G中的每条边都至少与其中一个点相关联,二分图的最小顶点覆盖数=二分图的最大匹配数;
②最小路径覆盖也称为最小边覆盖,是指用尽量少的不相交简单路径覆盖二分图中的所有顶点。二分图的最小路径覆盖数=|V|-二分图的最大匹配数;
最大独立集:最大独立集是指寻找一个点集,使得其中任意两点在图中无对应边。对于一般图来说,最大独立集是一个NP完全问题,对于二分图来说最大独立集=|V|-二分图的最大匹配数。如下图中黑色点即为一个最大独立集:
最小割定理:一个二分图中的最大匹配数等于这个图中的最小点覆盖数。