匈牙利算法

来源:互联网 发布:CMS淀粉 编辑:程序博客网 时间:2024/05/20 19:30

首先推荐一篇文章,个人觉得写得很好,以下只是我自己学习算法的一些心得.

http://www.cnblogs.com/shenben/p/5573788.html

一些定义


1、二分图

图论中的一种特殊模型。

把一个点集分成两个不相同的点集,且任意一条边的两个端点属于不同点集,这样的图称之为二分图.

类似的我们有网络流当中的源点、汇点的特殊模型.


2、匹配

这里写图片描述这里写图片描述
图三中的两条红颜色边没有交集,匹配了对应的一些顶点,称之为图二的一个匹配.


3、最大匹配

即一个二分图中所有匹配能匹配最多边数的匹配,称之为最大匹配.


4、完美匹配

即一个匹配能把所有顶点都覆盖到,则称之为完美匹配.

显然完美匹配一定是一个最大匹配.


5、交替路

从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。


6、增广路

从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发的点不算),则这条交替路称为增广路.

增广路有一个重要特点:非匹配边比匹配边多一条。因此,研究增广路的意义是改进匹配。


匈牙利

匈牙利正是求解以上模型的一种贪心算法.

由增广路的性质,增广路中的匹配边总是比未匹配边多一条,所以如果我们放弃一条增广路中的匹配边,选取未匹配边作为匹配边,则匹配的数量就会增加。匈牙利算法就是在不断寻找增广路,如果找不到增广路,就说明达到了最大匹配。

感性理解.