匈牙利算法的学习

匈牙利算法

基本概念:

1、 交错路:设P是图G的一条路,如果P的任意两条相邻的边一条是属于匹配M的,另外一条不属于匹配M,就称P是一条交错路。

2、 可增广路:两个端点都是非饱和点的交错路叫做可增广路。

3、 非饱和点Vi是图G的一个顶点,如果Vi 不与任意一条属于匹配M的边相关联,就称Vi 是一个非饱和点

算法:

1、 首先假设二分图两部分一部分顶点为,另外一部分顶点为。从出发,找一个非饱和点。放入集合S中。同时将的在图中相邻的点找到,放入集合NS)中。

如图,是一个非饱和点。将放入S中,同时与相邻的点有,。放入NS)中。

2、 NS)中任取一个点。我们这儿取。已经是饱和了的,不是非饱和点。是属于匹配M(图中红线是初始匹配MM={,,})的。将加入集合T加入结合S。形成新的集合。

3、 如图,NS)相应的进行了变化。我们在从NS)中取一个与相邻的点,我们取。发现,也是一个饱和点。于是重复上面的第二步。直到所取的点不是饱和点为止。

4、 如上图,NS)没有变化。我们再选中一个点,。发现是一个没饱和点。可以进行改进。线路。这是一条交错路,同时也是一条可增广路。对它改进。

5、 p1中属于匹配M的和不属于匹配M的互换(这个操作称之为增广路径的取反,一旦取反,新的匹配数就比原来的匹配数增加了1个)。这样,得到上图。

6、 重新找到一个未盖点。重复上述步骤。一直到不存在未盖点。后续的步骤我用图片形式给出。

当然,这只是一种可能的情况,也有可能直接我们在第一步就选择了,没有选择,那么可能会更加简单。

遵循这个流程:

参考文献:http://blog.csdn.net/akof1314/article/details/4421262

http://xuxiaoqi986.blog.163.com/blog/static/167376398201171710232714/

http://imlazy.ycool.com/post.1603708.html

后续的算法:

网络上有很多关于这类的算法,这儿不在提出。但是我列出了几个博客,他们的对于匈牙利算法的讲解比较清楚明白的。文章的图形也是摘自他们中的一篇。只是写出了我自己的一些看法。想要深入学习,可以到上面的网站去看看。

你可能感兴趣的:(算法学习)