分治法,最小权完美匹配(巨人和鬼,Ants,uva 1411)

本文探讨了使用分治法解决具有自相似性问题的方法,并以最小权完美匹配为例进行讲解。在最小权完美匹配中,通过二分图匹配算法寻找最优解决方案。文章还指出了在实现最小费最大流求解过程中,将数据类型从`ll`改为`double`的重要性,以及未开方导致错误的原因。最后提供了分治法和最小费最大流的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分治法解法:

感觉能用分治法解的问题都有自相似性吧。

就是说把大的情况按某种方式切成几个小的情况,这些小的情况和大的情况是相似的。

如果满足这个条件,那么最简单的情况的解答方案是显然的。

我们只需要考虑好如何合并多个小情况即可。

跟快速排序的思想很像啊。

看紫书P227吧,讲的详细。


最小权完美匹配解法:

黑点和白点个数相同,每个黑点要找一个白点,应该要想到二分图完美匹配。

二分图匹配的算法与模板就这么几个。

唯一能当边权的东西也就是距离了。

思考一下,一个个试试,也就差不多出来了。

要求不相交,则为距离的最小权匹配。还是比较机智的。

用最小费最大流求最小权完美匹配,完美匹配一定存在。

做的时候犯了个小错误,搞了好几个小时。

当时觉得把模板里ll改成double很麻烦,ll范围也够,反正都是找最短路,开不开方不影响距离大小的比较。

事实上改double很快的,分分钟改完而且不开方是错的。原因在于反向增广时会对距离进行求和,显然平方求和会降低短边的权重,增加长边的权重,导致找出来的最短路是错的。如


黑1


黑2             白1


                    白2


若第一次找最短路时(第一次肯定不会反向增广)找了白1连黑2。

若用平方,则发现交叉的情况距离短,因此会沿着错误的路径增广。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值