http://wenku.baidu.com/view/f9b3b08a680203d8ce2f2452.html
什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得
集合中边的权值之和最大或最小。而二分图的最佳匹配则一定为
完备匹配
,
在此基础上,才要求匹配的边权值之和最大或最小。二分图的
带权匹配与最
佳匹配不等价,也不互相包含
。
我们可以使用
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
原创讲解,转载请注明。
http://wenku.baidu.com/view/f9b3b08a680203d8ce2f2452.html相关推荐
- 分区文件http://wenku.baidu.com/view/d839d1868762caaedd33d4b7.html
http://wenku.baidu.com/view/d839d1868762caaedd33d4b7.html
- http://wenku.baidu.com/view/63e7b8270066f5335a812142.html
---恢复内容开始--- http://wenku.baidu.com/view/63e7b8270066f5335a812142.html 迷宫最短路径问题解析 有一个二维数组,0表示路,-1表示墙 ...
- https://wenku.baidu.com/view/1f9138e903d8ce2f01662306.html
https://wenku.baidu.com/view/1f9138e903d8ce2f01662306.html
- https://wenku.baidu.com/view/35c88b375acfa1c7aa00ccca.html--swot
https://wenku.baidu.com/view/35c88b375acfa1c7aa00ccca.html 转载于:https://www.cnblogs.com/anruy/p/97519 ...
- Analysis of Struts2 : http://wenku.baidu.com/view/ad421874a417866fb84a8e75.html
http://wenku.baidu.com/view/ad421874a417866fb84a8e75.html
- http://wenku.baidu.com/view/981f99d376eeaeaad1f330e7.html
http://wenku.baidu.com/view/981f99d376eeaeaad1f330e7.html
- http://wenku.baidu.com/view/d6433106a6c30c2259019e63.html
http://wenku.baidu.com/view/d6433106a6c30c2259019e63.html
- https://wenku.baidu.com/view/24def725e53a580217fcf
https://wenku.baidu.com/view/24def725e53a580217fcfe6d.html 转载于:https://blog.51cto.com/11067786/23404 ...
- http://wenku.baidu.com/view/8378e414f18583d049645951.html
http://wenku.baidu.com/view/8378e414f18583d049645951.html http://wenku.baidu.com/view/a88aff0d6c85ec ...
最新文章
- go语言中的float类型
- QIIME 2教程. 19使用q2-vsearch聚类ASVs为OTUs(2020.11)
- 单链表 操作的18种算法
- python:继承日志模块生成自定义日志
- 使用Java第2部分查询DynamoDB项
- 办公室分配方案python_Python自动化办公室(1),python,一
- 深度学习在计算机视觉点云中的发展与未来
- 多维度对比5款主流分布式MQ消息队列
- 项目交接文档_项目管理反思
- 简易方法判断浏览器的类型和版本
- cocoapods的安装使用
- 微软Power Platform在中国市场正式商用 无缝衔接微软智能云“三驾马车”
- C64+DSP资源手册笔记
- ollydbg 教程
- 教资之教育知识与能力 第一章第四节
- 接入层-汇聚层组网设计配置案例——双归上行-负载
- 根据录入的计算公式计算_炒股还需工匠精神:请笑纳30个财务分析指标和计算方式,上市公司财务分析必备,速速珍藏...
- 学习笔记 | 演化简单的程序用于玩 Atari 游戏
- c语言快速平方根算法,单片机开平方的快速算法
- Python 按时间顺序读取所选目录下文件