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 ...
随机推荐
- 20145105 《Java程序设计》第4周学习总结
20145105 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承与多态 一.何谓继承 (一)继承共同行为 继承基本上就是避免多个类间重复定义共同行为. 如:下述代码将剑 ...
- Tomcat 发布项目 conf/Catalina/localhost 配置 及数据源配置
本文介绍通过在tomcat的conf/Catalina/localhost目录下添加配置文件,来发布项目.因为这样对 tomcat 的入侵性最小,只需要新增一个配置文件,不需要修改原有配置:而且支持动 ...
- Spring Data JPA中CrudRepository与JpaRepository的不同
使用Spring Data JPA CrudRepository 和JpaRepository 的好处: 继承这些接口,可以使Spring找到自定义的数据库操作接口,并生成代理类,后续可以注入到Spr ...
- POJ - 1463 Strategic game (树状动态规划)
这题做的心塞... 整个思路非常清晰,d[i][0]表示第i个结点不设置监察的情况下至少需要的数量:d[i][1]表示第i个结点设置检查的情况下的最小需要的数量. 状态转移方程见代码. 但是万万没想到 ...
- Mininet 跑一个简单的ping测试
安装地址:https://github.com/mininet/mininet/wiki/Mininet-VM-Images 登录用户:mininet 密码:mininet 执行命令:sudo mn ...
- P4行为模型BMV2安装
前提:依赖关系请移步上篇博客.P4行为模型BMV2依赖关系安装:thrift nanomsg nnpy安装 以及,要把下面这些东西装好. On Ubuntu 14.04, the following ...
- SpringBoot与Dubbo整合下篇
(1)pom.xml引入相关依赖jar包,如下: <dependency> <groupId>com.alibaba</groupId> <artifactI ...
- Redis之hash数据结构实现
参考 https://www.cnblogs.com/ourroad/p/4891648.html https://blog.csdn.net/hjkl950217/article/details/7 ...
- c++之to_string()函数
函数原型:string to_string (int val);string to_string (long val);string to_string (long long val);string ...
- Java如何用一行代码初始化ArrayList
参考链接: 1.Initialization of an ArrayList in one line 2.java怎么用一行代码初始化ArrayList