【题解】Luogu UVA1411 Ants
原题传送门
博客里对二分图匹配的详细介绍
这道题是带权二分图匹配
用的是KM算法
我们要知道一个定理:要使线段没有相交,要使距离总和最小
我们先把任意一对白点、黑点的距离算一下
然后运用KM算法
因为要最小权值,所以需要把权值取反来求最大。
#include <bits/stdc++.h>
#define N 105
using namespace std;
inline void write(register int x)
{
if(!x)putchar('0');if(x<0)x=-x,putchar('-');
static int sta[25];int tot=0;
while(x)sta[tot++]=x%10,x/=10;
while(tot)putchar(sta[--tot]+48);
}
inline double Max(register double x,register double y)
{
return x>y?x:y;
}
inline double Min(register double x,register double y)
{
return x<y?x:y;
}
int n;
double X1[N],Y1[N],X2[N],Y2[N];
double dis[N][N];
double lx[N],ly[N];
int link[N],s[N],t[N];
inline bool dfs(register int x)
{
s[x]=1;
for(register int i=1;i<=n;++i)
if(fabs(lx[x]+ly[i]-dis[x][i])<1e-9&&!t[i])
{
t[i]=1;
if(!link[i]||dfs(link[i]))
{
link[i]=x;
return true;
}
}
return false;
}
inline void update()
{
double a=23333333;
for(register int i=1;i<=n;++i)
if(s[i])
for(register int j=1;j<=n;++j)
if(!t[j])
a=Min(a,lx[i]+ly[j]-dis[i][j]);
for(register int i=1;i<=n;++i)
{
if(s[i])
lx[i]-=a;
if(t[i])
ly[i]+=a;
}
}
inline void KM()
{
for(register int i=1;i<=n;++i)
{
link[i]=lx[i]=ly[i]=0;
for(register int j=1;j<=n;++j)
lx[i]=Max(lx[i],dis[i][j]);
}
for(register int i=1;i<=n;++i)
while(19260817)
{
for(register int j=1;j<=n;++j)
s[j]=t[j]=0;
if(dfs(i))
break;
else
update();
}
}
inline double getdis(register int x,register int y)
{
return sqrt(pow(X1[x]-X2[y],2)+pow(Y1[x]-Y2[y],2));
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(register int i=1;i<=n;++i)
scanf("%lf %lf",&X1[i],&Y1[i]);
for(register int i=1;i<=n;++i)
scanf("%lf %lf",&X2[i],&Y2[i]);
for(register int i=1;i<=n;++i)
for(register int j=1;j<=n;++j)
dis[j][i]=-getdis(i,j);
KM();
for(register int i=1;i<=n;++i)
write(link[i]),puts("");
}
return 0;
}
【题解】Luogu UVA1411 Ants的更多相关文章
- [题解] Luogu P5446 [THUPC2018]绿绿和串串
[题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...
- 题解 Luogu P2499: [SDOI2012]象棋
关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可 ...
- 题解 luogu P1144 【最短路计数】
本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优 ...
- 题解 Luogu P1110 【[ZJOI2007]报表统计】
感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT ...
- 题解 Luogu P3370
讲讲这题的几种做法: 暴力匹配法 rt,暴力匹配,即把字符串存起来一位一位判相等 时间复杂度$ O(n^2·m) $ 再看看数据范围 \(n\le10^5,m\le10^3\) 当场爆炸.当然有暴力分 ...
- UVaLive4043 UVa1411 Ants 巨人与鬼
题意:给出平面上n个白点n个黑点,要求两两配对,且配对所连线段没有交点. 法一:暴力 随机一个初始方案,枚举任意两条线段如果有交点就改一下. 效率其实挺好的. 法二:二分图最佳完美匹配 显然没有交点的 ...
- 题解 Luogu P3623 [APIO2008]免费道路
[APIO2008]免费道路 题目描述 新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可 ...
- [题解]luogu P4116 Qtree3
终于来到了Qtree3, 其实这是Qtree系列中最简单的一道题,并不需要线段树, 只要树链剖分的一点思想就吼了. 对于树链剖分剖出来的每一根重链,在重链上维护一个Set就好了, 每一个Set里存的都 ...
- 题解 Luogu P3959 【宝藏】
来一篇不那么慢的状压??? 话说这题根本没有紫题难度吧,数据还那么水 我是不会告诉你我被hack了 一看数据规模,n≤12,果断状压. 然后起点要枚举,就设dp状态: f[i][j]=以i为起点到j状 ...
随机推荐
- node使用 mongoose聚合 group
var mongoose = require('mongoose'); mongoose.connect("mongodb://localhost:27017/test", fun ...
- node跨域cors模块,nodejs+express跨域
使用express写的接口,只能在内部使用,如果想要外部的服务访问,就涉及到了跨域.但是又不想用jsonp,其实有一个node模块,可以轻松实现跨域 npm install cors --save 然 ...
- centos下如何清除重复的$PATH变量值
运行: vim /etc/profile 添加如下代码: awk -F: '{ sep = "" for (i = 1; i <= NF; ++i) ...
- TL-WAR1200L V1.0升级软件20170609
TL-WAR1200L_V1.0升级软件20170609.part1.rar TL-WAR1200L_V1.0升级软件20170609.part2.rar TP-LINK WVR& ...
- MongoDB--编译文件
-j 加你的cpu核数来加速编译过程 编译出错可以自行安装所需依赖. 或者去官网直接下载编译好的二进制,直接执行. 编译好之后查看文件: mongod:mongodb的执行程序,数据库部署也用这个程序 ...
- 第一章入门篇CSS样式的分类、盒模型
1.CSS样式的分类 CSS样式分为一项4种: 1.内联样式表,直接写在元素style属性里面的样式,如 <p style="color:red;">内联样式</ ...
- centos7 cpanm安装,及perl模块安装
1. cpan安装 yum安装 yum install perl-App-cpanminus.noarch 注意:安装完成后,root及非root用户都可以使用cpanm安装模块,root用户直接用c ...
- Java之.jdk安装-Windows
jdk安装-windows 1. window + r,然后输入:cmd,打开黑窗口. 2. 分别输入 java -version .javac -version,检查jdk版本信息. 如果javac ...
- Spark核心RDD:combineByKey函数详解
https://blog.csdn.net/jiangpeng59/article/details/52538254 为什么单独讲解combineByKey? 因为combineByKey是Spark ...
- 从js中提取数据
<script language="JavaScript" type="text/javascript+gk-onload"> SKART = (S ...