poj 2565 Ants (KM+思维)
|
Ants
Description Young naturalist Bill studies ants in school. His ants feed on plant-louses that live on apple trees. Each ant colony needs its own apple tree to feed itself. Bill has a map with coordinates of n ant colonies and n apple trees. He knows that ants travel from their colony to their feeding places and back using chemically tagged routes. The routes cannot intersect each other or ants will get confused Bill would like to connect each ant colony to a single apple tree so that all n routes are non-intersecting straight lines. In this problem such connection is always possible. Your task is to write a program that finds such connection. ![]() On this picture ant colonies are denoted by empty circles and apple trees are denoted by filled circles. One possible connection is denoted by lines. Input The first line of the input file contains a single integer number n (1 ≤ n ≤ 100) — the number of ant colonies and apple trees. It is followed by n lines describing n ant colonies, followed by n lines describing n apple trees. Each ant Output Write to the output file n lines with one integer number on each line. The number written on i-th line denotes the number (from 1 to n) of the apple tree that is connected to the i-th ant colony. Sample Input 5 Sample Output 4 Source |
||||||||||
题意:
给你n个黑点和n个白点。叫你找出一种连点的方法使得每一白点连一个黑点。切连线不与其他连线相交。
思路:
看上去跟想几何问题跟KM没什么关系。但确实是KM题。
求连线的最短距离即可了。由于在连线距离最小的条件下。不会有两条直线相交的情况。画个图就知道(三角形两边之和大于第三边)。
须要稍稍的转换下。两点间的价值为距离的负数。还有特别注意答案要求输出每个C相应的A。所以建边时要注意left[i]代表什么!鄙人就为这个WA了好几发。TT。
具体见代码:
#include<algorithm>
#include<iostream>
#include<string.h>
#include<sstream>
#include<stdio.h>
#include<math.h>
#include<vector>
#include<string>
#include<queue>
#include<set>
#include<map>
//#pragma comment(linker,"/STACK:1024000000,1024000000")
using namespace std;
const int INF=0x3f3f3f3f;
const double eps=1e-6;
const double PI=acos(-1.0);
const int maxn=110;
//typedef __int64 ll;
int le[maxn],n;
double lx[maxn],ly[maxn],slack[maxn],w[maxn][maxn],ax[maxn],ay[maxn],bx[maxn],by[maxn];
bool visx[maxn],visy[maxn];
double dist(double x1,double y1,double x2,double y2)
{
double x=x1-x2,y=y1-y2;
return sqrt(x*x+y*y);
}
bool match(int x)
{
int y;
double tp;
visx[x]=true;
for(y=1;y<=n;y++)
{
if(visy[y])
continue;
tp=lx[x]+ly[y]-w[x][y];
if(tp<eps)
{
visy[y]=true;
if(!le[y]||match(le[y]))
{
le[y]=x;
return true;
}
}
else
slack[y]=min(slack[y],tp);
}
return false;
}
void update()
{
int i;
double d; for(i=1,d=INF;i<=n;i++)
if(!visy[i])
d=min(d,slack[i]);
for(i=1;i<=n;i++)
{
if(visx[i])
lx[i]-=d;
if(visy[i])
ly[i]+=d;
else
slack[i]-=d;
}
}
void KM()
{
int i,j,x; memset(le,0,sizeof le);
for(i=1;i<=n;i++)
{
lx[i]=-INF;//注意这里!!
ly[i]=0;
for(j=1;j<=n;j++)
lx[i]=max(lx[i],w[i][j]);
}
for(x=1;x<=n;x++)
{
for(i=1;i<=n;i++)
slack[i]=INF;
while(1)
{
for(i=1;i<=n;i++)
visx[i]=visy[i]=false;
if(match(x))
break;
else
update();
}
}
}
int main()
{
int i,j; while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)
scanf("%lf%lf",&ax[i],&ay[i]);
for(i=1;i<=n;i++)
scanf("%lf%lf",&bx[i],&by[i]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
w[j][i]=-dist(ax[i],ay[i],bx[j],by[j]);//这里特别注意!因为答案输出的关系
KM();
for(i=1;i<=n;i++)
printf("%d\n",le[i]);
}
return 0;
}
版权声明:本文博客原创文章。博客,未经同意,不得转载。
poj 2565 Ants (KM+思维)的更多相关文章
- poj3565 Ants km算法求最小权完美匹配,浮点权值
/** 题目:poj3565 Ants km算法求最小权完美匹配,浮点权值. 链接:http://poj.org/problem?id=3565 题意:给定n个白点的二维坐标,n个黑点的二维坐标. 求 ...
- POJ 1852 Ants || UVA 10881 - Piotr's Ants 经典的蚂蚁问题
两题很有趣挺经典的蚂蚁问题. 1.n只蚂蚁以1cm/s的速度在长为L的竿上爬行,当蚂蚁爬到竿子的端点就会掉落.当两只蚂蚁相撞时,只能各自反向爬回去.对于每只蚂蚁,给出距离左端的距离xi,但不知道它的朝 ...
- POJ 1852 Ants(贪心)
POJ 1852 Ants 题目大意 有n只蚂蚁在木棍上爬行,每只蚂蚁的速度都是每秒1单位长度,现在给你所有蚂蚁初始的位置(蚂蚁运动方向未定),蚂蚁相遇会掉头反向运动,让你求出所有蚂蚁都·掉下木棍的最 ...
- poj 3565 uva 1411 Ants KM算法求最小权
由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了…… 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...
- POJ 3565 Ants 【最小权值匹配应用】
传送门:http://poj.org/problem?id=3565 Ants Time Limit: 5000MS Memory Limit: 65536K Total Submissions: ...
- poj 1852 ants 题解《挑战程序设计竞赛》
地址 http://poj.org/problem?id=1852 题目描述 Description An army of ants walk on a horizontal pole of len ...
- poj 3565 ants
/* poj 3565 递归分治 还有用KM的做法 这里写的分治 按紫书上的方法 不过那里说的有点冗杂了 可以简化一下 首先为啥可以分治 也就是分成子问题解决 只要有一个集合 黑白的个数相等 就一定能 ...
- 【POJ3565】ANTS KM算法
[POJ3565]ANTS 题意:平面上有2*n个点,N白N黑.为每个白点找一个黑点与之连边,最后所有边不交叉.求一种方案. 题解:KM算法真是一个神奇的算法,虽然感觉KM能做的题用费用流都能做~ 本 ...
- POJ 3565 Ants(最佳完美匹配)
Description Young naturalist Bill studies ants in school. His ants feed on plant-louses that live on ...
随机推荐
- 谈论高并发(二十二)解决java.util.concurrent各种组件(四) 深入了解AQS(二)
上一页介绍AQS其基本设计思路以及两个内部类Node和ConditionObject实现 聊聊高并发(二十一)解析java.util.concurrent各个组件(三) 深入理解AQS(一) 这篇说一 ...
- 【从翻译mos文章】Weblogic AdminServer 启动fail,报错"unable to get file lock, will retry"
Weblogic AdminServer 启动fail,报错"unable to get file lock, will retry" 参考原始: Weblogic AdminSe ...
- zoj 3288 Domination (可能dp)
///dp[i][j][k]代表i行j列件,并把一k的概率 ///dp[i][j][k]一种常见的方法有四种传输 ///1:dp[i-1][j][k-1] 可能 (n-(i-1))*j/(n*m-(k ...
- tomcat 重启进程
查看端口: ps -aux | grep tomcat 发现并没有8080端口的Tomcat进程. 使用命令:netstat –apn 查看所有的进程和端口使用情况.发现下面的进程列表,其中最后一栏是 ...
- Android 设计模式模式适配器
自定义适配器模式:一类的接口,转换成客户的期望,也是一个接口.适配器使原本接口不是与类兼容可以无缝.下面两个图看起来更加清晰 watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...
- Asp.net MVC4 +EF6开发
Asp.net MVC4 +EF6开发的个人网站源码和介绍(仅供新手学习) 本项目是我去年利用业余时间开发的,采用的是asp.net mvc 4 +EF6+三层架构,适合新手进行学习,高手就没有什么价 ...
- 从原理角度解析Android (Java) http 文件上传
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23781773 文件上传是我们项目中经常使用的功能,一般我们的服务器可能都是web ...
- .Net中获取打印机的相关信息
原文:.Net中获取打印机的相关信息 新项目中牵涉到对打印机的一些操作,最重要的莫过于获取打印机的状态,IP等信息,代码量不大,但是也是自己花了一点时间总结出来的,希望能帮助需要的朋友. Printe ...
- 集合hashCode()方法和equals()办法
1.哈希码: Object中的HashCode方法会返回该对象的的内存真实地址的整数化表示,这个形象的不是真正抵制的整数值就是哈希码. 2.利用哈希码向集合中插入数据的顺序? ...
- mysqlbackup 还原特定的表
mysqlbackup使用TTS恢复指定表. ************************************************************* 4.恢复特定表 ******* ...
