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 ...
随机推荐
- SQL Server2008安装图解
1).双击set.up安装:
- 上传jar包至nexus
上传命令: mvn deploy:deploy-file -DgroupId=com.xxx -DartifactId=xxx-pdf -Dversion=16.10.0 -Dpackaging=ja ...
- HDU 4300 Clairewd’s message(扩展KMP)题解
题意:先给你一个密码本,再给你一串字符串,字符串前面是密文,后面是明文(明文可能不完成整),也就是说这个字符串由一个完整的密文和可能不完整的该密文的明文组成,要你找出最短的密文+明文. 思路:我们把字 ...
- linux开启nscd服务缓存加速
在我使用的阿里云主机上有观察到开启了一个服务nscd ,后来谷哥了下该服务的作用.了解到nscd会缓存三种服务passwd group hosts,所以它会记录三个库,分别对应源/etc/passwd ...
- G_M_网络流A_网络吞吐量
调了两天的代码,到最后绝望地把I64d改成lld就过了,我真的是醉了. 网络吞吐量 题面:给出一张(n个点,m条边)带权(点权边权均有)无向图,点权为每个点每秒可以接受发送的最大值,边权为花费,保证数 ...
- python 生成zip压缩包
import zipfile file_name="a.txt" f = zipfile.ZipFile('test.zip','w',zipfile.ZIP_STORED) f. ...
- Spark读取结构化数据
读取结构化数据 Spark可以从本地CSV,HDFS以及Hive读取结构化数据,直接解析为DataFrame,进行后续分析. 读取本地CSV 需要指定一些选项,比如留header,比如指定delimi ...
- MVP框架模式
一.基本概念 MVP是Model-View-Presenter的简称,即模型-视图-表现层的缩写.MVP是由MVC模式进化而来的,MVP改进了MVC中的控制器过于臃肿的问题.与MVC一样,MVP将应用 ...
- 微软Azure DevOps自动化部署
1.准备一个https://hub.docker.com账号,申请一个免费的镜像仓库(免费账户可以申请一个) 创建docker远程镜像库 2.新建一个mvc的项目 给这个项目加上Dockerfile文 ...
- HDU1565 方格取数 &&uva 11270 轮廓线DP
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...