匈牙利算法
基本概念:
1、 交错路:设P是图G的一条路,如果P的任意两条相邻的边一条是属于匹配M的,另外一条不属于匹配M,就称P是一条交错路。
2、 可增广路:两个端点都是非饱和点的交错路叫做可增广路。
3、 非饱和点:设Vi是图G的一个顶点,如果Vi 不与任意一条属于匹配M的边相关联,就称Vi 是一个非饱和点。
算法:
1、 首先假设二分图两部分一部分顶点为,另外一部分顶点为。从出发,找一个非饱和点。放入集合S中。同时将的在图中相邻的点找到,放入集合N(S)中。
如图,是一个非饱和点。将放入S中,同时与相邻的点有,。放入N(S)中。
2、 在N(S)中任取一个点。我们这儿取。已经是饱和了的,不是非饱和点。是属于匹配M(图中红线是初始匹配M,M={,,})的。将加入集合T,加入结合S。形成新的集合。
3、 如图,N(S)相应的进行了变化。我们在从N(S)中取一个与相邻的点,我们取。发现,也是一个饱和点。于是重复上面的第二步。直到所取的点不是饱和点为止。
4、 如上图,N(S)没有变化。我们再选中一个点,。发现是一个没饱和点。可以进行改进。线路。这是一条交错路,同时也是一条可增广路。对它改进。
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
后续的算法:
网络上有很多关于这类的算法,这儿不在提出。但是我列出了几个博客,他们的对于匈牙利算法的讲解比较清楚明白的。文章的图形也是摘自他们中的一篇。只是写出了我自己的一些看法。想要深入学习,可以到上面的网站去看看。