题目大意:

给定\(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. linux 会话 进程组 守护进程

    Linux 下每个进程都会有一个非负整数表示的唯一进程 ID ,简称 pid . Linux 提供了 getpid 函数来获取 进程的 pid ,同时还提供了 getppid 函数来获取父进程的 pi ...

  2. Fiddler的一系列学习瞎记3

    Http: 不安全.可以很容易被拦截,或者其他的嗅探工具发现.怎么样做到安全?起码一下两点: 1.浏览器和we服务器之间的内容应该只有浏览器和web服务器能看到通信内容. 2.Http请求和Http的 ...

  3. 验证rbd的缓存是否开启

    简单快速的在客户端验证rbd的cache是否开启 首先修改配置文件 在ceph.conf中添加: [client] rbd cache = true rbd cache writethrough un ...

  4. Docker版EKL安装记录文档

    Docker版EKL安装记录文档 拉取已下三个镜像 docker.io/logstash 7.5.2 b6518c95ed2f 6 months ago 805 MB docker.io/kibana ...

  5. ASP.NET Core管道详解[3]: Pipeline = IServer + IHttpApplication

    ASP.NET Core的请求处理管道由一个服务器和一组中间件构成,但对于面向传输层的服务器来说,它其实没有中间件的概念.当服务器接收到请求之后,会将该请求分发给一个处理器进行处理,对服务器而言,这个 ...

  6. 赶紧收藏!这些Java中的流程控制知识你都不知道,你凭什么涨薪?

    Java的流程控制 基础阶段 目录: 用户交互Scanner 顺序结构 选择结构 循环结构 break & continue 练习题 1.Scanner对象 之前我们学的基本语法中并没有实现程 ...

  7. leetcode117. 填充每个节点的下一个右侧节点指针 II

    给定一个二叉树struct Node {  int val;  Node *left;  Node *right;  Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节 ...

  8. 日常踩坑-------新手使用idea

    mybatis在idea的maven项目中的坑 今天遇到mybatis的报错,搞了好久才搞懂,在网上找了好久的相似案例,也没有搞定,先来看下网上常见的解决办法吧,相信也能解决大部分人的报错. 1.ma ...

  9. vue 项目在 IE11 里呈现空白,不兼容的问题解决方案

    我用vue 2.6.11版本编写的项目,在谷歌浏览器上运行的好好地,但是放到ie11浏览器上却是一片空白. 这个问题遇到的时候,我是蒙蔽了,抓紧去搜了搜百度,百度上的答案倒是都很统一. 都是说ie不兼 ...

  10. C语言中connst用法

    1.const一般用来定义只读变量,这个变量的之只能在初始化时赋值,如果初始化时没有赋值,则默认为0.如果在其他地方试图更改此值,编译会报错.如: 1 #include<stdio.h> ...