匈牙利算法
匈牙利算法:讲的很细致。
匈牙利算法-看这篇绝对就够了!:很生动形象
1,用途:匈牙利算法主要用于解决一些与二分图匹配有关的问题(最大匹配和最小覆盖点数)。
二分图:是一类特殊的图,它可以被划分为两个部分,每个部分内的点互不相连。下图是典型的二分图。
2,最大匹配
2.1,基本概念:
- 交错路径和增广路径
- 红色表示当前的匹配点对(a1-b2匹配,a2-b3匹配)我们发现这个不是最完美的匹配,黑色表示可以匹配到一起的点,但是当前没有匹配。
- 第二个路径匹配的更多(a1-b1, b2-a2, a3-b3)那么这个时候,匹配为最大。
- 对应匹配
显然第二个图匹配结果最好。这是一个完美匹配,每一个顶点都找到了匹配。
2.2,非完美匹配
-
匹配图
每条线表示能够匹配的数
-
匹配步骤
从b的方向看。
- 1,b1 -> a1(形成一个匹配)
- 2,b2 -> a1, a1 != b1, b1 -> a2(交错路径为:b2->a1->b1->a2),完成匹配(b1-a1, b1-a2)
-
3,b3-a3
-
4,b4->a2, a2 !=b1, b1->a1, a1!=b2 (交错路径为: b4->a2->b1->a1->b2), 完成匹配(a1-b1, a2-b4, a3-b3)
- 5, b5->a4,完成匹配
完成匹配对为:(a1,b1), (a2, b4), (a3,b3), (a4, b5), b2和a5并没有得到匹配
3, 带权值的匈牙利算法
3.1, 问题描述
n个工人,指派n个工作,每个工人完成特定工作的时间不一样,进行分配,使总时间最少。
权值矩阵
3.2,算法步骤
1.每一行减去该行最小值
2.通过寻找增广路径的方式,尝试进行不带权重的匹配,只有值为0的项为可匹配项
3.如果最大匹配数为n,则结束,当前匹配为最优匹配,否则执行第4步
4.用最少的横线和竖线覆盖所有零值,取mv=未被覆盖的矩阵块的最小元素,所有未被覆盖的矩阵块的元素减去mv,所有被横竖线都覆盖的矩阵块的元素加上mv,然后回到第2步
标红的0为结果的临时匹配
3.3,结论
(1)划线(所有横线竖线)数量p<n
(2)矩阵块A的大小比D小,意味着A的元素数量比D小
(3)分析(算法复杂度为n*n)