匈牙利算法

来源:互联网 发布:淘宝动漫 编辑:程序博客网 时间:2024/05/20 16:44

首先,匈牙利算法是用来求二分图的最大匹配的,它的核心问题就是找增广路径。匈牙利算法的时间复杂度为O(VE),其中

V为二分图左边的顶点数,E为二分图中边的数目。


现在我们来看看增广路有哪些性质:


(1)有奇数条边。

(2)起点在二分图的左半边,终点在右半边。

(3)路径上的点一定是一个在左半边,一个在右半边,交替出现。

(4)整条路径上没有重复的点。

(5)起点和终点都是目前还没有配对的点,而其它所有点都是已经配好对的。

(6)路径上的所有第奇数条边都不在原匹配中,所有第偶数条边都出现在原匹配中。

(7)最后,也是最重要的一条,把增广路径上的所有第奇数条边加入到原匹配中去,并把增广路径中的所有第偶数条边从原

匹配中删除(这个操作称为增广路径的取反),则新的匹配数就比原匹配数增加了1个。


当然,匹配开始时我们任意选择一边的所有点为起始点找增广路径,由增广路的性质可以看出,每找到一条增广路径,匹配

数增加1。



很多问题都可以转化为二分图匹配模型。二分图有如下几种常见变形:


(1)二分图的最小顶点覆盖 

最小顶点覆盖要求用最少的点(X或Y中都行),让每条边都至少和其中一个点关联。

Knoig定理:二分图的最小顶点覆盖数等于二分图的最大匹配数。


(2)DAG图的最小路径覆盖 

用尽量少的不相交简单路径覆盖有向无环图(DAG)G的所有顶点,这就是DAG图的最小路径覆盖问题。

结论:DAG图的最小路径覆盖数 = 节点数(n)- 最大匹配数(m)


(3)二分图的最大独立集

最大独立集问题: 在N个点的图G中选出m个点,使这m个点两两之间没有边.求m最大值

结论:二分图的最大独立集数 = 节点数(n)— 最大匹配数(m)

0 0
原创粉丝点击