poj 3565 uva 1411 Ants KM算法求最小权
由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了……
有两种事物,不难想到用二分图。这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案。为啥呢?因为如果有四个点,a,b,c,d 。Ab和cd交叉,ac和bd不交叉,那么ac和bd的长度和一定小于ab和cd的长度和,可以画一个图很容易就证出来。所以,如果所有的边都不交叉,又因为有解,那么最小的权值和就是解了。附图一枚,自己画的,比较简陋,凑活着看吧……

用KM算法求最佳完美匹配最小权值和,可以直接把所有的权值转成负值,在求最大权值和,但是这种方法我觉得有些不对劲,但是不知道在哪里= =,上网一查,才发现这种方法只能用于x和y数量相同的时候,正统做法应该是用一个很大的数减去每个权值,再求最大权值和。PS:我用的是取反的方法……
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#define N 110
struct sss
{
int x,y;
}white[N],black[N];
int n,vx[N],vy[N],fa[N];
double w[N][N],px[N],py[N],str[N];
double dis(int i,int j)
{
return sqrt((double)(black[i].x-white[j].x)*(black[i].x-white[j].x)+(double)(black[i].y-white[j].y)*(black[i].y-white[j].y));
}
int find(int now)
{
int i,j,k;
if (now==)
return ;
vx[now]=;
for (i=;i<=n;i++)
{
if (!vy[i]&&fabs(px[now]+py[i]-w[now][i])<0.00001)
{
vy[i]=;
if (fa[i]==||find(fa[i]))
{
fa[i]=now;
return ;
}
}
else
if (str[i]>px[now]+py[i]-w[now][i])
str[i]=px[now]+py[i]-w[now][i];
}
return ;
}
void KM()
{
int i,j,k,x,y,z;
double na;
memset(fa,,sizeof(fa));
for (i=;i<=n;i++)
{
memset(str,0x7f,sizeof(str));
while ()
{
memset(vx,,sizeof(vx));
memset(vy,,sizeof(vy));
if (find(i))
break;
na=0x7f;
for (j=;j<=n;j++)
if (!vy[j]&&na>str[j])
na=str[j];
for (j=;j<=n;j++)
{
if (vx[j])
px[j]-=na;
if (vy[j])
py[j]+=na;
else
str[j]-=na;
}
}
}
}
int main()
{
int i,j,k,x,y,z;
z=;
while(scanf("%d",&n)!=EOF)
{
if (z)
printf("\n");
else
z=;
for (i=;i<=n;i++)
px[i]=-;
memset(py,,sizeof(py));
for (i=;i<=n;i++)
scanf("%d%d",&white[i].x,&white[i].y);
for (i=;i<=n;i++)
scanf("%d%d",&black[i].x,&black[i].y);
for (i=;i<=n;i++)
for (j=;j<=n;j++)
{
w[i][j]=-dis(i,j);
if (px[i]<w[i][j])
px[i]=w[i][j];
}
KM();
for (i=;i<=n;i++)
printf("%d\n",fa[i]);
}
}
poj 3565 uva 1411 Ants KM算法求最小权的更多相关文章
- poj3565 Ants km算法求最小权完美匹配,浮点权值
/** 题目:poj3565 Ants km算法求最小权完美匹配,浮点权值. 链接:http://poj.org/problem?id=3565 题意:给定n个白点的二维坐标,n个黑点的二维坐标. 求 ...
- 【POJ 2195】 Going Home(KM算法求最小权匹配)
[POJ 2195] Going Home(KM算法求最小权匹配) Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- hdu1533 Going Home km算法解决最小权完美匹配
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- POJ-2195 Going Home---KM算法求最小权值匹配(存负边)
题目链接: https://vjudge.net/problem/POJ-2195 题目大意: 给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致.man每移动一格 ...
- poj - 3686 The Windy's (KM算法)
题意:n个订单和m个生产车间,每个订单在不同的车间生产所需要的时间不一样,并且每个订单只能在同一个车间中完成,直到这个车间完成这个订单就可以生产下一个订单.现在需要求完成n个订单的平均时间最少是多少. ...
- uva 1411 Ants (权值和最小的完美匹配---KM算法)
uva 1411 Ants Description Young naturalist Bill studies ants in school. His ants feed on plant-louse ...
- UVA 1411 - Ants(二分图完美匹配)
UVA 1411 - Ants 题目链接 题意:给定一些黑点白点,要求一个黑点连接一个白点,而且全部线段都不相交 思路:二分图完美匹配,权值存负的欧几里得距离,这种话,相交肯定比不相交权值小,所以做一 ...
- 训练指南 UVA - 11383(KM算法的应用 lx+ly >=w(x,y))
layout: post title: 训练指南 UVA - 11383(KM算法的应用 lx+ly >=w(x,y)) author: "luowentaoaa" cata ...
- 【POJ 2400】 Supervisor, Supervisee(KM求最小权匹配)
[POJ 2400] Supervisor, Supervisee(KM求最小权匹配) Supervisor, Supervisee Time Limit: 1000MS Memory Limit ...
随机推荐
- Volley使用指南第一回(来自developer.android)
最近闲来想看看android网络方面的东西.google在2013年发布了一个叫做Volley的网络请求框架,我看了一下官网,居然在training里面就有教程.首先,英文的东西看着 还是挺不爽的,特 ...
- MyEclipse与Mysql数据库的连接
1.载入MySql驱动程序 Class.forName("com.mysql.jdbc.Driver"); // 载入MySql驱动程序 2.建立Connection连接对象 ...
- JS 数据类型转换-转换函数、强制类型转换、利用js变量弱类型转换
1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法,这两个函数才能正确运行:对其他类型 ...
- 金蝶K3 破解版
- .NET连接MySQL数据库的方法实现
突然对.NET连接MySQL数据库有点兴趣,于是乎网上到处找资料,学习MySQL的安装,MySQL的使用等等等等,终于搞定了! 最终效果就是显示数据库中数据表的数据: 首先,当然要有MySQL数据库啦 ...
- Android 通用获取Ip的方法(判断手机是否联网的方法)!!!
大家好,我们这一节讲一下,Android获取Ip的一些方法,在我们开发中,有判断手机是否联网,或者想获得当前手机的Ip地址,当然WIFI连接的和 我们3G卡的Ip地址当然是不一样的. 首先我尝试了如下 ...
- ios开发——实用技术篇&网络音频播放
网络音频播放 在日常的iOS开发中,我们通常会遇到媒体播放的问题,XCode中已经为我们提供了功能非常强大的AVFoundation框架和 MediaPlayer框架.其中AVFoundation框架 ...
- Abap 内表的语法
ABAP中的内表相当于其他程序设计语言中的二维数组,存储多行结构相同的数据 不同于二维数组,内表在创建后,列结构与列数是固定不变的,而行数是动态增长的 内表支持循环对每行数据进行操作,也支持整体操作 ...
- 为什么for不能有序遍历数组的所有元素?(Array的设计原理)
这个题目略微浅显,但却不易讲明白.如果我告诉你,我们不能以任何代码保证可以有序遍历出一个数组的所有元素,你肯定会反驳我,因为使用for明明就可以啊!但其实不是. 一.为什么FOR不能保证遍历所有? 代 ...
- android123 zhihuibeijing 新闻中心-新闻 页签 ViewPagerIndicator实现
## ViewPagerIndicator ## 使用导入ViewPagerIndicator库的方式相当于可以改源码,打包编译Eclips可以自动完成. ViewPager指针项目,在使用ViewP ...