POJ3565
题目大意:
给定\(n\)个蚂蚁和\(n\)颗苹果树的坐标,要求每个蚂蚁爬到一颗苹果树旁,使得每个蚂蚁路线不相交且路线总长度最小,求每个蚂蚁爬到哪个苹果树旁?
首先假设有两只蚂蚁路径相交,那么这两个蚂蚁交换目标一定使得总路线缩短且不相交,所以总长度最短时所有蚂蚁路线一定不相交
怎么让总路线最短呢?二分图最小权匹配
其实只要把边权全部取反然后跑最大权匹配就好了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
namespace red{
#define int long long
#define eps (1e-6)
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
const int N=210;
int n;
struct node
{
int x,y;
}ant[N],tr[N];
double jx[N][N];
inline int sqr(int x){return x*x;}
inline double dis(int i,int j)
{
return sqrt(sqr(ant[i].x-tr[j].x)+sqr(ant[i].y-tr[j].y));
}
double exl[N],exr[N],slack[N];
bool visl[N],visr[N];
int f[N],g[N];
inline bool find(int x)
{
visl[x]=1;
for(int y=1;y<=n;++y)
{
if(visr[y]) continue;
double tmp=exl[x]+exr[y]-jx[x][y];
if(fabs(tmp)<eps)
{
visr[y]=1;
if(!f[y]||find(f[y]))
{
f[y]=x;
g[x]=y;
return 1;
}
}
else slack[y]=min(tmp,slack[y]);
}
return 0;
}
inline void km()
{
for(int i=1;i<=n;++i)
{
exl[i]=jx[i][1];
for(int j=2;j<=n;++j)
{
exl[i]=max(exl[i],jx[i][j]);
}
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
visl[j]=visr[j]=0;
slack[j]=1e9+7;
}
if(find(i)) continue;
while("haku")
{
double tmp=1e9+7;
int t;
for(int j=1;j<=n;++j)
if(!visr[j]) tmp=min(tmp,slack[j]);
for(int j=1;j<=n;++j)
{
if(visl[j]) exl[j]-=tmp;
if(visr[j]) exr[j]+=tmp;
else
{
slack[j]-=tmp;
if(fabs(slack[j])<eps) t=j;
}
}
if(!f[t]) break;
visr[t]=1,visl[f[t]]=1;
t=f[t];
for(int j=1;j<=n;++j)
slack[j]=min(slack[j],exl[t]+exr[j]-jx[t][j]);
}
memset(visl,0,sizeof(visl));
memset(visr,0,sizeof(visr));
find(i);
}
for(int i=1;i<=n;++i) printf("%lld\n",g[i]);
}
inline void main()
{
while(~scanf("%lld",&n))
{
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
memset(exl,0,sizeof(exl));
memset(exr,0,sizeof(exr));
for(int i=1;i<=n;++i)
{
ant[i].x=read(),ant[i].y=read();
}
for(int i=1;i<=n;++i)
{
tr[i].x=read(),tr[i].y=read();
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
jx[i][j]=-dis(i,j);
}
}
km();
}
}
}
signed main()
{
red::main();
return 0;
}
POJ3565的更多相关文章
- [poj3565]Ants
[poj3565]Ants 标签(空格分隔):二分图 描述 Young naturalist Bill studies ants in school. His ants feed on plant-l ...
- 【POJ3565】ANTS KM算法
[POJ3565]ANTS 题意:平面上有2*n个点,N白N黑.为每个白点找一个黑点与之连边,最后所有边不交叉.求一种方案. 题解:KM算法真是一个神奇的算法,虽然感觉KM能做的题用费用流都能做~ 本 ...
- poj3565 Ants km算法求最小权完美匹配,浮点权值
/** 题目:poj3565 Ants km算法求最小权完美匹配,浮点权值. 链接:http://poj.org/problem?id=3565 题意:给定n个白点的二维坐标,n个黑点的二维坐标. 求 ...
- POJ-3565 Ants---KM算法+slack优化
题目链接: https://vjudge.net/problem/POJ-3565 题目大意: 在坐标系中有N只蚂蚁,N棵苹果树,给你蚂蚁和苹果树的坐标.让每只蚂蚁去一棵苹果树, 一棵苹果树对应一只蚂 ...
- POJ3565 Ants (不相交线)
那请告诉我 A - D B - C 和 A - C B - D 那个的和小 显然是A - C B - D (可以根据四边形 对角线大于对边之和) 然后 求的答案是不是就一定是不相交的 就是 ...
- POJ3565带权匹配——km算法
题目:http://poj.org/problem?id=3565 神奇结论:当总边权最小时,任意两条边不相交! 转化为求二分图带权最小匹配. 可以用费用流做.但这里学一下km算法. https:// ...
- POJ3565 Ants 和 POJ2195 Going Home
Ants Language:Default Ants Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7975 Accepted: ...
- ACM学习历程—POJ3565 Ants(最佳匹配KM算法)
Young naturalist Bill studies ants in school. His ants feed on plant-louses that live on apple trees ...
- [poj3565] Ants (二分图带权匹配)
传送门 Description 年轻自然主义者比尔在学校研究蚂蚁. 他的蚂蚁以苹果树上苹果为食. 每个蚁群都需要自己的苹果树来养活自己. 比尔有一张坐标为 n 个蚁群和 n 棵苹果树的地图. 他知道蚂 ...
- 带权二分图——KM算法hdu2255 poj3565
进阶指南的板子好像有点问题..交到hdu上会T 需要了解的一些概念: 交错树,顶标,修改量 #include<iostream> #include<stdio.h> #incl ...
随机推荐
- tcp 输入 简析 转载
正常来说 TCP 收消息过程会涉及三个队列: Backlog Queue sk->sk_backlog Prequeue tp->ucopy.prequeue Receive Queue ...
- 自适应哈希索引(Adaptive Hash Index, AHI) 转
Adaptive Hash Index, AHI 场景 比如我们每次从辅助索引查询到对应记录的主键,然后还要用主键作为search key去搜索主键B+tree才能找到记录. 当这种搜索变多了,inn ...
- FLEX弹性布局小结
1. 弹性盒子中: flex: 0 1 auto表示什么意思 flex默认三个参数是flex-grow, flex-shrink, flex-basis,默认值是0 1 auto. flex-grow ...
- JS处理Long类型精度丢失问题
解决方式一 json注解 public class ProductVo { @JsonSerialize(using=ToStringSerializer.class) private Lo ...
- 应聘阿里,字节跳动,美团必须掌握的Spring IOC与工厂模式
Spring IOC与工厂模式 PS:本文内容较为硬核,需要对java的面向对象.反射.类加载器.泛型.properties.XML等基础知识有较深理解. (一)简单介绍 在讲Spring IOC之前 ...
- 标准库之time,random,sys,os
# import time # print(time.time()) # 时间戳 # print(time.mktime(time.localtime())) # 结构化时间转换为时间戳 # prin ...
- [sql 注入] insert 报错注入与延时盲注
insert注入的技巧在于如何在一个字段值内构造闭合. insert 报错注入 演示案例所用的表: MariaDB [mysql]> desc test; +--------+--------- ...
- 粉丝少的UP主如何赚大钱
常逛B站的小伙伴应该知道,B站官方经常会推出各类征稿活动,奖金池也非常高,少则几万,多则上百万,可以说非常受UP主们的欢迎. 图1:B站各类活动 要知道,除了少数头部UP主可能因为没(有)有(钱)看( ...
- 有什么数据恢复软件可以恢复CF数据
虽然现在SD卡出现并且日益流行,但是CF卡(Compact Flash)作为一种存储设备,仍然是专业数码相机的主流标准.不仅是数码相机,CF接口还广泛用于PDA.笔记本电脑和包括台式机在内的各种设备. ...
- 数学分析理论(rudin版)笔记:实数系和复数系.2:抄书版
有理数(rational number)记为 Q,实数记为 R 虽然任意两个不同的有理数间还有一个有理数,但是有理数集中还是会有 "间隙",而实数集填补了这些间隙. 集合(set) ...