KM算法,在此不涉及科学的证明,仅仅是粗略的说明算法的正确性。
题目链接
题意
第一个参数是代表点的对数。
接下来n行表示蚂蚁的坐标
接下来n行表示apple tree的坐标
要求第i个蚂蚁对应的苹果树的序号,要求任意一种连线不能重合的方案即可
题解
不妨将蚂蚁抽象成白点,苹果树抽象成黑点。黑点和白点构成了二分图的关系。两点间边的权值对应着欧几里得距离。
那么为什么使用KM算法是正确的呢?
假设最佳完美匹配中,存在两条相交的直线\(a_1-b_1\)和\(a_2-b_2\)。那么dist(a1, b1)+dist(a2, b2)一定大于dist(a1, b2)+dist(a2, b1);
而后者是不相交的。而KM算法算的是权值和最大的值.但是我们可以将原理的权值转换为负值来求最大值,再取反从而求得了最小值。
AC 代码
说明:这是我在网上找到的一个复杂度为O(\(n^3\))的算法,代码风格不是很好。
去除了原来算法中的slack[]变量。
|
|
KM算法
原理及其正确性
首先我们定义两个概念:
可行顶标是一个节点函数l,使得对任意的弧(x, y), 有l(x)+l(y)\(\geq\)w(x, y)。
进一步的说明:l(x)和l(y)函数的值都是人为的自由的设定的, w(x, y)是边的权值,题目中给定。相等子图是G的生成子图,包含所有的点,但是只包含l(x)+l(y) = w(x, y)的所有的边(x, y)。
证明上面的结论:
- 设\(M^* \)是相等子图的完美匹配,那么\(M^*\)的边权和等于点的权值和(顶标的和);
- 任取G的一个完美匹配M,由于M中边满足不等式w(x, y)\(\geq\)l(x)+l(y),M的边权的和不能超过所有的顶标之和。
- 综合前面两点,完美匹配不能超过顶标之和(第二条的规定保证),并且能够取到等号(第一条的规定保证),那么顶标之和就是权值最大了。
模板代码
|
|
hdu 6346 更快的km模板
|
|
适用的场景范围
题目中的二分图的两个集合中元素的个数要相同,即要首先要存在完美匹配。且两点间一定要有刻量的边权关系。(比如好感度,若两者间没有好感,那么边权赋值为0,不能是无法连接的状态。)
未解决的问题
KM算法还可以用费用来实现,这样的思想还不会。
适应的场景范围需要进一步的刷题求证。