【KM算法小结】

来源:互联网 发布:中国软件产业协会 编辑:程序博客网 时间:2024/06/09 17:47

最近学习了下KM算法,发现异常的好编,而且思想非常巧妙,通过顶标,相当于是迭代最优解再验证可行性的算法。

 

百度百科上写的非常通俗:

 

  初始时为了使A[ i ]+B[j]>=w[i,j]恒成立,令A[ i ]为所有与顶点Xi关联的边的最大权,B[j]=0。如果当前的相等子图没有完备匹配,就按下面的方法修改顶标以使扩大相等子图,直到相等子图具有完备匹配为止。

  我们求当前相等子图的完备匹配失败了,是因为对于某个X顶点,我们找不到一条从它出发的交错路。这时我们获得了一棵交错树,它的叶子结点全部是X顶点。现在我们把交错树中X顶点的顶标全都减小某个值d,Y顶点的顶标全都增加同一个值d,那么我们会发现:

  1)两端都在交错树中的边(i,j),A[ i ]+B[j]的值没有变化。也就是说,它原来属于相等子图,现在仍属于相等子图。

  2)两端都不在交错树中的边(i,j),A[ i ]和B[j]都没有变化。也就是说,它原来属于(或不属于)相等子图,现在仍属于(或不属于)相等子图。

  3)X端不在交错树中,Y端在交错树中的边(i,j),它的A[ i ]+B[j]的值有所增大。它原来不属于相等子图,现在仍不属于相等子图。

  4)X端在交错树中,Y端不在交错树中的边(i,j),它的A[ i ]+B[j]的值有所减小。也就说,它原来不属于相等子图,现在可能进入了相等子图,因而使相等子图得到了扩大。

  现在的问题就是求d值了。为了使A[ i ]+B[j]>=w[i,j]始终成立,且至少有一条边进入相等子图,d应该等于:

  Min{A[ i ]+B[j]-w[i,j] | Xi在交错树中,Yi不在交错树中}。

 

      关于这个d值首先显然遇过d值如果更小了不会使得交错数有所增广,大了有可能会跳过最优解,这是自己的理解。

      还有一个【“松弛量”函数slack】的常数优化,在二分图为完全二分图的情况下,可以快很多。

 

      其实KM算法可以做的费用流也可以做,但是在KM算法中隐含了一个数学模型,那就是满足所有A[ i ]+B[j]>=w[i,j]恒成立,最小化{∑A[i]+∑B[i]}。

 

POJ2195KM代码:

 

原创粉丝点击