【POJ3565】ANTS KM算法
【POJ3565】ANTS
题意:平面上有2*n个点,N白N黑。为每个白点找一个黑点与之连边,最后所有边不交叉。求一种方案。
题解:KM算法真是一个神奇的算法,虽然感觉KM能做的题用费用流都能做~
本题用到的结论:当选出的点对之间的距离之和最小时,一定使所有边都不交叉
这个感觉很容易理解,自己画画图就能看出来,就是难想啊
然后跑最小权值匹配,方法是将边权都变成相反数,然后跑最大权值匹配
不知道为什么以前写的KM算法会TLE,将求temp的过程拿到主函数里就过了
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int n;
int xa[110],ya[110],xb[110],yb[110],va[110],vb[110],from[110],sta[110];
double dis[110][110],la[110],lb[110],temp;
int dfs(int x)
{
va[x]=1;
for(int i=1;i<=n;i++)
{
if(!vb[i]&&fabs(la[x]+lb[i]-dis[x][i])<1e-6)
{
vb[i]=1;
if(!from[i]||dfs(from[i]))
{
from[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
scanf("%d",&n);
int i,j,k;
for(i=1;i<=n;i++) scanf("%d%d",&xa[i],&ya[i]);
for(i=1;i<=n;i++) scanf("%d%d",&xb[i],&yb[i]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
dis[i][j]=-sqrt(1.0*(xa[i]-xb[j])*(xa[i]-xb[j])+(ya[i]-yb[j])*(ya[i]-yb[j]));
for(i=1;i<=n;i++)
for(j=2,la[i]=dis[i][1];j<=n;j++)
la[i]=max(la[i],dis[i][j]);
for(i=1;i<=n;i++)
{
while(1)
{
memset(va,0,sizeof(va));
memset(vb,0,sizeof(vb));
temp=99999999.999999;
if(dfs(i)) break;
for(j=1;j<=n;j++) if(va[j])
for(k=1;k<=n;k++) if(!vb[k])
temp=min(temp,la[j]+lb[k]-dis[j][k]);
for(j=1;j<=n;j++) if(va[j]) la[j]-=temp;
for(j=1;j<=n;j++) if(vb[j]) lb[j]+=temp;
}
}
for(i=1;i<=n;i++) sta[from[i]]=i;
for(i=1;i<=n;i++) printf("%d\n",sta[i]);
return 0;
}
【POJ3565】ANTS KM算法的更多相关文章
- poj3565 Ants km算法求最小权完美匹配,浮点权值
/** 题目:poj3565 Ants km算法求最小权完美匹配,浮点权值. 链接:http://poj.org/problem?id=3565 题意:给定n个白点的二维坐标,n个黑点的二维坐标. 求 ...
- poj 3565 uva 1411 Ants KM算法求最小权
由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了…… 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...
- ACM学习历程—POJ3565 Ants(最佳匹配KM算法)
Young naturalist Bill studies ants in school. His ants feed on plant-louses that live on apple trees ...
- UVALive 4043 Ants 蚂蚁(二分图最佳完美匹配,KM算法)
题意: 有n个蚂蚁n棵树,蚂蚁与树要配对,在配对成功的一对之间连一条线段,要求所有线段不能相交.按顺序输出蚂蚁所匹配的树. 思路: 这个题目真是技巧啊,不能用贪心来为每个蚂蚁选择最近的树,这样很可能是 ...
- POJ3565带权匹配——km算法
题目:http://poj.org/problem?id=3565 神奇结论:当总边权最小时,任意两条边不相交! 转化为求二分图带权最小匹配. 可以用费用流做.但这里学一下km算法. https:// ...
- 训练指南 UVALive - 4043(二分图匹配 + KM算法)
layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...
- POJ3565 Ants 和 POJ2195 Going Home
Ants Language:Default Ants Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7975 Accepted: ...
- 匈牙利算法与KM算法
匈牙利算法 var i,j,k,l,n,m,v,mm,ans:longint; a:..,..]of longint; p,f:..]of longint; function xyl(x,y:long ...
- 【HDU2255】奔小康赚大钱-KM算法
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...
随机推荐
- jquery.validate校验+jquery.form提交,配合使用
原文链接:http://www.cnblogs.com/datoubaba/archive/2012/06/06/2538873.html 概述:本篇主要讨论jquery.validate结合jque ...
- mysql 用户自定义变量
SQL中可以用变量来操作值.那么问题就来了.mysql中怎么定义一个变量呢? 一.定义变量 1.定义变量的语法: set @var_name=expr [,@var_name=expr] ... 2. ...
- unity, undo
如果在操作一个Object之前调用Undo.RecordObject(Object),且操作确实造成Object某些属性的改变,则会产生一个undo记录. 如果我们的架构不是直接操作Object,而是 ...
- jQuery事件:bind、delegate、on的区别
最近在AngularJS的开发中,遇到一个神奇的事情:我们用到livebox来预览评论列表中的图片, 然而评论列表是由Angular Resource动态载入的.不可思议的是,点击这些动态载入的图片仍 ...
- ubuntu下载linux内核源码
ubuntu仓库里面关于源码部分配置的好全啊,什么都有,ps:包括vim的各种插件居然也有人打包放到仓库里,真是方便. 1.首先查看一下本系统使用的内核版本号: cat /proc/version L ...
- 改善用户体验,用图片的自身变化以及进度通知摆脱传统的进度条,okhttp,Canvas,Paint实现
转载请注明出处:王亟亟的大牛之路 从最開始的白页面等待,到后来的进度条告知用户.到如今的WebBO/微信这样的先下缩略图点击才又一次下大图的方式,我们开发人员对用户感知的注意度越来越高.昨天刷微博的时 ...
- Android从无知到有知——NO.5
今天整一下利用广播实现ip拨号. 这一块主要用到的知识是android四大组件之中的一个的broadcast receiver(广播接收者).那么它接收什么东东呢,就是我们所无谓的一个个的事件,比 ...
- Git Manual / Git使用手册 / Git, GitLab, Git Bash, TortoiseGit (建议全文复制到Word文档中通过导航窗格查看)
Git使用手册 目录 1 引言 2 Git.GitLab简介 2.1 Git 2.2 GitLab 2.3 Git基本概念 3 运行环境 4 ...
- 数据库填充DataSet,逐行访问
DataSet 对象是 Microsoft .NET 框架中数据访问的关键部分,是可保存表.视图和关系的内存中对象.本文介绍如何使用一个或多个数据库查询的结果填充 DataSet 对象,以及在将这些数 ...
- c/c++常见关键字解释
c语言中常见关键字: char : =>声明字符型变量或函数 double :=>声明双精度变量或函数 enum : =>声明枚举类型 float: =>声明 ...