什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得
集合中边的权值之和最大或最小。而二分图的最佳匹配则一定为
完备匹配
,
在此基础上,才要求匹配的边权值之和最大或最小。二分图的
带权匹配与最
佳匹配不等价,也不互相包含
。
我们可以使用
KM
算法实现求二分图的最佳匹配。方法我不再赘述,可以参
考
tianyi
的讲解
。
KM
算法可以实现为
O(N^3)
。
[KM
算法的几种转化
]
KM
算法是求最大权完备匹配,如果要求最小权完备匹配怎么办?方法很简
单,只需将所有的边权值取其相反数,求最大权完备匹配,匹配的值再取相
反数即可。
KM
算法的运行要求是
必须存在一个完备匹配
,如果求一个最大权匹配
(
不一
定完备
)
该如何办?依然很简单,把不存在的边权值赋为
0
。
KM
算法求得的最大权匹配是
边权值和
最大,如果我想要
边权之积
最大,又
怎样转化?还是不难办到,每条边权取自然对数,然后求最大和权匹配,求
得的结果
a
再算出
e^a
就是最大积匹配。
至于精度问题则没有更好的办法了。
[
求最小
(
大
)
权匹配的费用流建模方法
]
求最小
(
大
)
权匹配,可以用最小
(
大
)
费用最大流的方法。和二分图最大匹配的
构图方法类似,添加附加源
S
和附加汇
T
,从
S
向二分图
X
集合中每个顶点
连接一条权值为
0
,容量为
1
的有向边,从
Y
集合中每个顶点向
T
也连接一
条权值为
0
,
容量为
1
的有向边。
然后把原有的边变成容量为
1
,
权值不变的
有向边。求从
S
到
T
的最小
(
大
)
费用最大流,就能求得最小
(
大
)
权匹配。
上述建模求最大权匹配的方法求得的
一定
是最佳匹配
(
如果存在完备匹配
)
,
因
为
S
到
X
集合每条边全部满流。如下图所示,最小费用最大流为
2
。
要求最大权匹配
(
不一定完备匹配
)
。如下图,只需再引入一个顶点
A
,从
X
集合的每个顶点向
A
连接一条容量为
1
,权值为
0
的边,然后再由
A
向
T
连
接一条权值为
0
,容量不小于
|X|
的边,求最大费用最大流,这时是
100
。
最小权匹配也类似,
不过新加的边权要为一个极大值,
大于所有已有边权值。
[KM
算法与费用流的比较
]
从理论上分析,
KM
算法的时间复杂度比费用流要好,但是实际上和较好的
费用流算法比起来运行效率是差不多的,
KM
算法优势仅仅在于编程容易。
而对于十分稀疏的图,
许多优秀的费用流算法效率是很高的。
这并不说明
KM
算法不如费用流,毕竟在信息学竞赛中,编程的复杂度也是一个相当重要的
需要考虑的因素。
BYVoid
原创讲解,转载请注明。