【题解】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状 ...
随机推荐
- leetcode 300最长上升子序列
用递归DFS遍历所有组合肯定积分会超时,原因是有很多重复的操作,可以想象每次回溯后肯定会有重复操作.所以改用动态规划.建立一个vector<int>memo,初始化为1,memo[i]表示 ...
- js使用的一些实用技巧
1.jquery中页面定时调用ajax方法 function SetContinueSend(param1,param2, func){ func.call(null,param1,param2) } ...
- ida脚本函数
#打印光标所在位置函数中地址和汇编代码 startaddr=GetFunctionAttr(ea, FUNCATTR_START) items = idautils.FuncItems(startad ...
- GE与POST方法区别
1.用途. GET方法一般用于查询并获取信息,这意味着它是幂等的(对同一个url的多个请求,返回结果完全一样),因为没有修改资源状态,所以它是安全的.而POST一般用于更新资源信息,既不是幂等,也不是 ...
- Springboot整合Mybatis 之分页插件使用
1: 引入jar包 <!-- 引入MyBatis分页插件--> <dependency> <groupId>com.github.pagehelper</gr ...
- VMWare虚拟机 window文件传递
无论是将虚拟机的文件传到window上或者是将window上文件传到虚拟机上: 都可以选中文件,然后拖动文件到另一个系统上 提前:虚拟机安装了VMWARE Tools 1)window上文件拖到虚拟机 ...
- 擠出機步進馬達的 Steps per Unit 該如何計算?
擠出機步進馬達的 Steps per Unit 該如何計算? 這邊 Steps per Unit 指的是塑料往前推進1mm,步進馬達須要走幾步.依此定義,可知計算方式可以用 步進馬達轉一圈需要的步 ...
- uva 12222 Mountain Road
题意: 有一个单行道,两个方向都有车在等待.给出每个车的方向以及到达的时间以及走完这段路所需要的时间. 为了防止车祸,同向两车通过任一点的时间间隔不得小于10s. 求最后一辆车离开时刻的最小值. 思路 ...
- tcp_协议基础
具体7层 数据格式 功能与连接方式 典型设备 应用层 Application 数据Data 网络服务与使用者应用程序间的一个接口 终端设备(PC.手机.平板等) 表示层 Presentation ...
- 虚拟机连不上网 Xshell连不上虚拟机
以centos7 为例 1,确定network connection 为NAT 2, 打开网络连接中心 Control Panel\Network and Internet\Network Conne ...