题目大意:

给定\(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的更多相关文章

  1. [poj3565]Ants

    [poj3565]Ants 标签(空格分隔):二分图 描述 Young naturalist Bill studies ants in school. His ants feed on plant-l ...

  2. 【POJ3565】ANTS KM算法

    [POJ3565]ANTS 题意:平面上有2*n个点,N白N黑.为每个白点找一个黑点与之连边,最后所有边不交叉.求一种方案. 题解:KM算法真是一个神奇的算法,虽然感觉KM能做的题用费用流都能做~ 本 ...

  3. poj3565 Ants km算法求最小权完美匹配,浮点权值

    /** 题目:poj3565 Ants km算法求最小权完美匹配,浮点权值. 链接:http://poj.org/problem?id=3565 题意:给定n个白点的二维坐标,n个黑点的二维坐标. 求 ...

  4. POJ-3565 Ants---KM算法+slack优化

    题目链接: https://vjudge.net/problem/POJ-3565 题目大意: 在坐标系中有N只蚂蚁,N棵苹果树,给你蚂蚁和苹果树的坐标.让每只蚂蚁去一棵苹果树, 一棵苹果树对应一只蚂 ...

  5. POJ3565 Ants (不相交线)

    那请告诉我 A - D  B - C  和  A - C  B - D 那个的和小 显然是A - C  B - D  (可以根据四边形 对角线大于对边之和) 然后 求的答案是不是就一定是不相交的 就是 ...

  6. POJ3565带权匹配——km算法

    题目:http://poj.org/problem?id=3565 神奇结论:当总边权最小时,任意两条边不相交! 转化为求二分图带权最小匹配. 可以用费用流做.但这里学一下km算法. https:// ...

  7. POJ3565 Ants 和 POJ2195 Going Home

    Ants Language:Default Ants Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7975 Accepted: ...

  8. ACM学习历程—POJ3565 Ants(最佳匹配KM算法)

    Young naturalist Bill studies ants in school. His ants feed on plant-louses that live on apple trees ...

  9. [poj3565] Ants (二分图带权匹配)

    传送门 Description 年轻自然主义者比尔在学校研究蚂蚁. 他的蚂蚁以苹果树上苹果为食. 每个蚁群都需要自己的苹果树来养活自己. 比尔有一张坐标为 n 个蚁群和 n 棵苹果树的地图. 他知道蚂 ...

  10. 带权二分图——KM算法hdu2255 poj3565

    进阶指南的板子好像有点问题..交到hdu上会T 需要了解的一些概念: 交错树,顶标,修改量 #include<iostream> #include<stdio.h> #incl ...

随机推荐

  1. tcp 输入 简析 转载

    正常来说 TCP 收消息过程会涉及三个队列: Backlog Queue sk->sk_backlog Prequeue tp->ucopy.prequeue Receive Queue  ...

  2. 自适应哈希索引(Adaptive Hash Index, AHI) 转

    Adaptive Hash Index, AHI 场景 比如我们每次从辅助索引查询到对应记录的主键,然后还要用主键作为search key去搜索主键B+tree才能找到记录. 当这种搜索变多了,inn ...

  3. FLEX弹性布局小结

    1. 弹性盒子中: flex: 0 1 auto表示什么意思 flex默认三个参数是flex-grow, flex-shrink, flex-basis,默认值是0 1 auto. flex-grow ...

  4. JS处理Long类型精度丢失问题

    解决方式一 json注解 public class ProductVo {​   @JsonSerialize(using=ToStringSerializer.class)   private Lo ...

  5. 应聘阿里,字节跳动,美团必须掌握的Spring IOC与工厂模式

    Spring IOC与工厂模式 PS:本文内容较为硬核,需要对java的面向对象.反射.类加载器.泛型.properties.XML等基础知识有较深理解. (一)简单介绍 在讲Spring IOC之前 ...

  6. 标准库之time,random,sys,os

    # import time # print(time.time()) # 时间戳 # print(time.mktime(time.localtime())) # 结构化时间转换为时间戳 # prin ...

  7. [sql 注入] insert 报错注入与延时盲注

    insert注入的技巧在于如何在一个字段值内构造闭合. insert 报错注入 演示案例所用的表: MariaDB [mysql]> desc test; +--------+--------- ...

  8. 粉丝少的UP主如何赚大钱

    常逛B站的小伙伴应该知道,B站官方经常会推出各类征稿活动,奖金池也非常高,少则几万,多则上百万,可以说非常受UP主们的欢迎. 图1:B站各类活动 要知道,除了少数头部UP主可能因为没(有)有(钱)看( ...

  9. 有什么数据恢复软件可以恢复CF数据

    虽然现在SD卡出现并且日益流行,但是CF卡(Compact Flash)作为一种存储设备,仍然是专业数码相机的主流标准.不仅是数码相机,CF接口还广泛用于PDA.笔记本电脑和包括台式机在内的各种设备. ...

  10. 数学分析理论(rudin版)笔记:实数系和复数系.2:抄书版

    有理数(rational number)记为 Q,实数记为 R 虽然任意两个不同的有理数间还有一个有理数,但是有理数集中还是会有 "间隙",而实数集填补了这些间隙. 集合(set) ...