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协议---转载
https://cloud.tencent.com/developer/article/1150971 前言 说到TCP协议,相信大家都比较熟悉了,对于TCP协议总能说个一二三来,但是TCP协议又是一 ...
- linux中几个文本文件查看命令
Linux中,常用的文本文件查看命令介绍如下: 1. cat 用法: cat [options] filename options: -A: 显示全部. -E: 在每一行的后面加上"$&qu ...
- UNP第13章——守护进程
1. 守护进程的启动方法 (1)系统初始化脚本启动,在系统启动阶段,按照如/etc目录或/etc/rc开头的目录中的某些脚本启动,这些守护进程一开始就有超级用户权限.如inetd,cron,Web服务 ...
- springboot做邮件发送功能时报错No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSender' available:的问题解决方案
1.检查application.yml中的配置是否正确 spring.mail.host=smtp.xxx.comspring.mail.username=xxx@xxx.comspring.mail ...
- 精尽MyBatis源码分析 - MyBatis初始化(四)之 SQL 初始化(下)
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- api4excel - 接口自动化测试excel篇
api4excel - 接口自动化测试excel篇 工作原理: 测试用例在excel上编辑,使用第三方库xlrd,读取表格sheet和内容,sheetName对应模块名,Jenkins集成服务发现服务 ...
- 训练yolo之前,anchor聚类问题
前期做数据可视化,发现标签数据存在一些孤立点(噪声点),影响kmeans聚类. 处理方法如下: 使用kmeans迭代10次得到聚类中心 计算所有数据到其聚类中心的欧式距离均值和方差 通过拟合正态分布, ...
- 推荐系统实践 0x09 基于图的模型
用户行为数据的二分图表示 用户的购买行为很容易可以用二分图(二部图)来表示.并且利用图的算法进行推荐.基于邻域的模型也可以成为基于图的模型,因为基于邻域的模型都是基于图的模型的简单情况.我们可以用二元 ...
- 03_Service的绑定
Start Service启动的Service,Application退出,Service也不会退出: Bind Service启动的Service,Application退出,Service就会退出 ...
- 记安装Wampsever
遇到的问题: Wampsever 启动所有服务后图标为黄色 localhost 问题:显示 IIS Windows 在用 localhost 访问本机的php文件和用ip地址(不是127.0.0.1) ...