博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj3565Ants——KM算法
阅读量:4353 次
发布时间:2019-06-07

本文共 987 字,大约阅读时间需要 3 分钟。

题目:

首先,我们神奇地发现,没有相交边的匹配可以转化为距离和最小的匹配,所以可以使用KM算法求带权匹配;

要求的是距离和最小,所以把边权转化成负值来求最大;

KM算法有点难理解,看了许多博客,总算朦胧懂了:

首先,每个点有一个“顶标”,用来计算边权和,起初所有左部点的顶标都为相连边的最大边权,右部点的为0;

两个点匹配成功,仅当其顶标和等于其边权(所以可以通过调整顶标来控制边权);

一次dfs没有成功返回0时,我们已经记录下它经过的所有点,这些点都满足“其顶标和等于其边权”条件,组成了一个相等子图;

然而此时的相等子图无法使遍历到的这个左部点得到匹配,所以需要调整顶标;

可知最终的匹配中顶标和等于边权和,为了让顶标和下降最少而又有可能使这个点得到匹配,我们在所有相等子图中的左部点和不在相等子图中的右部点之间找到距离满足条件最小的差值,这样根据它调整顶标后,顶标和下降最少,而又至少会多出这一组可行的点加入相等子图;

这样重复进行,直到这个左部点匹配成功;

最后匹配的权值和是现在的顶标和,这个顶标和比起一开始我们期望的和(每个左部点顶标为其所连最大的边)有所下调,但我们保证每次下调量最少,所以得到最优匹配。

代码如下:

#include
#include
#include
#include
using namespace std;double const inf=999999.999999,eps=1e-7;int const MAXN=105;int n,pre[MAXN],ans[MAXN],xa[MAXN],xb[MAXN],ya[MAXN],yb[MAXN];double dis[MAXN][MAXN],la[MAXN],lb[MAXN];bool va[MAXN],vb[MAXN];bool dfs(int x){ va[x]=1; for(int i=1;i<=n;i++) if(!vb[i]&&fabs(la[x]+lb[i]-dis[x][i])

 

转载于:https://www.cnblogs.com/Zinn/p/8870817.html

你可能感兴趣的文章
sql server使用中遇到的问题记录
查看>>
jQuery的hover方法搭配css的hover选择器,实现选中元素突出显示
查看>>
基于局域网的超简易即时通讯软件(二)
查看>>
Android开发之漫漫长途 番外篇——内存泄漏分析与解决
查看>>
学习笔记:Python3 函数
查看>>
团队开发进度报告2
查看>>
bzoj1018
查看>>
codevs 2803 爱丽丝·玛格特罗依德
查看>>
java8的十大新特性
查看>>
Ms sql server 数据类型说明
查看>>
shadow密码文件
查看>>
归并排序及优化(Java实现)
查看>>
kubernates使用kubeadm安装
查看>>
图说超线程技术(Hyper-Threading Technology)
查看>>
首页跳转
查看>>
insert into select 与select into from -- sql 批量插入
查看>>
剑指offer-二叉树的镜像
查看>>
关于 Activity 中 startActivityForResult 和 onActivityResult
查看>>
Entity Framework Code First (一)Conventions
查看>>
asp.net程序集强签名
查看>>