POJ3565带权匹配——km算法
题目:http://poj.org/problem?id=3565
神奇结论:当总边权最小时,任意两条边不相交!
转化为求二分图带权最小匹配。
可以用费用流做。但这里学一下km算法。
https://blog.csdn.net/c20180630/article/details/70175814
km算法适用于求二分图带权最大匹配,所以这里把边权取反。
核心思想在于给两部点带上顶标,通过顶标限制连边,调整顶标实现最优匹配。
一定要注意匈牙利的时候写上!ib[i]的限制!
找调整最小值的时候,也许不止是右部未匹配点,而是右部不在相等子图中的点都可以。
不知怎的,calc里的sqrt如果不写1.0*就会编译错误。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N=;
const double INF=99999.99999,eps=1e-;
int n,x[N],y[N],pre[N];
double dis[N][N],da[N],db[N];
bool ia[N],ib[N];
double calc(int xa,int xb,int ya,int yb)
{return sqrt(1.0*(xa-xb)*(xa-xb)+1.0*(ya-yb)*(ya-yb));}
bool check(int cur)
{
ia[cur]=;
for(int i=;i<=n;i++)
if(!ib[i]&&fabs(da[cur]+db[i]-dis[cur][i])<eps)//!ib[i]&&fabs
{
ib[i]=;
if(!pre[i]||check(pre[i]))
{
pre[i]=cur;return true;
}
}
return false;
}
int main()
{
scanf("%d",&n);int xx,yy;
for(int i=;i<=n;i++)scanf("%d%d",&x[i],&y[i]);
for(int i=;i<=n;i++)
{
scanf("%d%d",&xx,&yy);
da[i]=-INF;
for(int j=;j<=n;j++)
dis[i][j]=-calc(xx,x[j],yy,y[j]),da[i]=max(da[i],dis[i][j]);
}
for(int i=;i<=n;i++)
{
memset(ia,,sizeof ia);
memset(ib,,sizeof ib);
while(!check(i))
{
double d=INF;
for(int i=;i<=n;i++) if(ia[i])
for(int j=;j<=n;j++) if(!ib[j])//也许不是!pre[j]
d=min(d,da[i]+db[j]-dis[i][j]);//符号
for(int i=;i<=n;i++)
{
if(ia[i])da[i]-=d;if(ib[i])db[i]+=d;
}
memset(ia,,sizeof ia);
memset(ib,,sizeof ib);
}
}
for(int i=;i<=n;i++)
printf("%d\n",pre[i]);
return ;
}
POJ3565带权匹配——km算法的更多相关文章
- 二分图带权匹配 KM算法与费用流模型建立
[二分图带权匹配与最佳匹配] 什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值之和最大或最小.而二分图的最佳匹配则一定为完备匹配,在此基础上,才要求匹配的边权值之和最大 ...
- 带权二分图——KM算法hdu2255 poj3565
进阶指南的板子好像有点问题..交到hdu上会T 需要了解的一些概念: 交错树,顶标,修改量 #include<iostream> #include<stdio.h> #incl ...
- hdu3722Card Game(KM最大带权匹配)
题目请戳这里 题目大意:给n个字符串,再给一个n的排列:p1,p2....pn.然后将第i个字符串贴到第pi个字符串后面,然后形成一个环.pi的首字符和第i个字符串的末尾字符就相邻,如果这2个字符相等 ...
- 奔小康赚大钱---hdu2255(最大带权匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 带权匹配问题的模板: 运用KM算法: #include<stdio.h> #incl ...
- 二分图最大权匹配——KM算法
前言 这东西虽然我早就学过了,但是最近才发现我以前学的是假的,心中感慨万千(雾),故作此篇. 简介 带权二分图:每条边都有权值的二分图 最大权匹配:使所选边权和最大的匹配 KM算法,全称Kuhn-Mu ...
- 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 训练指南 UVALive - 4043(二分图匹配 + KM算法)
layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...
- 二分图的最大匹配以及带权匹配【匈牙利算法+KM算法】
二分图算法包括 匈牙利算法 与 KM算法. 匈牙利算法 在这里写上模板. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 #include< ...
- ACM学习历程—POJ3565 Ants(最佳匹配KM算法)
Young naturalist Bill studies ants in school. His ants feed on plant-louses that live on apple trees ...
随机推荐
- c++第二十七天
p135~p140:1.位运算符.作用于整数类型的运算对象,并把运算对象看成是二进制的集合,提供检查和设置二进制位的功能. 2.bitest:一种可表示任意大小的二进制位集合的标准库类型. 3.关于符 ...
- Centos75下samba搭建配置
工作中,很经常需要把Linux服务器上的文件共享到windows上面,这时候需要在Linux服务器上安装samba套件. samba服务很好的实现了windows和linux之间的文件共享. 下面配置 ...
- SQL优化之limit 1
在某些情况下,如果明知道查询结果只有一个,SQL语句中使用LIMIT 1会提高查询效率. 例如下面的用户表(主键id,邮箱,密码): create table t_user( id int prim ...
- 使用索贝尔(Sobel)进行梯度运算时的数学意义和代码实现研究
对于做图像处理的工程师来说,Sobel非常熟悉且常用.但是当我们需要使用Sobel进行梯度运算,且希望得到“数学结果”(作为下一步运算的基础)而不是“图片效果”的时候,就必须深入了解Sobel的知识原 ...
- Xilinx SD controller
Features supported by driver Zynq All the HW/IP features are supported by driver ZynqMP All the HW/I ...
- jquery-ui autocomplete在模态框(model)中,出不来
知识点:在使用模态框中使用 jquery-ui autocomplete,无法显示下拉框的数据 参考博客:https://www.jianshu.com/p/3944693773ed 解决办法:在au ...
- Ubuntu 安装Docker
参考:官网 安装依赖包: $ sudo apt-get update $ sudo apt-get install -y --no-install-recommends \ linux-image-e ...
- idea tomcat启动乱码问题
配置idea的安装文件的编码: JetBrains\IntelliJ IDEA 2016.3\bin中配置文件idea.exe.vmoptions.idea64.exe.vmoptions 添加 -D ...
- requestWindowFeature()的应用
android开发中经常会在setContentView(R.layout.XXX); 前设置requestWindowFeature(XXXX). 他的意思是需要软件全屏显示.自定义标题(使用按钮等 ...
- shell 判断是否是目录
创建一个文件和一个文件夹 touch sss mkdir d test.sh #!/bin/bash echo "enter the name:" read filename if ...