原题传送门

博客里对二分图匹配的详细介绍

这道题是带权二分图匹配

用的是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的更多相关文章

  1. [题解] Luogu P5446 [THUPC2018]绿绿和串串

    [题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...

  2. 题解 Luogu P2499: [SDOI2012]象棋

    关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可 ...

  3. 题解 luogu P1144 【最短路计数】

    本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优 ...

  4. 题解 Luogu P1110 【[ZJOI2007]报表统计】

    感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT ...

  5. 题解 Luogu P3370

    讲讲这题的几种做法: 暴力匹配法 rt,暴力匹配,即把字符串存起来一位一位判相等 时间复杂度$ O(n^2·m) $ 再看看数据范围 \(n\le10^5,m\le10^3\) 当场爆炸.当然有暴力分 ...

  6. UVaLive4043 UVa1411 Ants 巨人与鬼

    题意:给出平面上n个白点n个黑点,要求两两配对,且配对所连线段没有交点. 法一:暴力 随机一个初始方案,枚举任意两条线段如果有交点就改一下. 效率其实挺好的. 法二:二分图最佳完美匹配 显然没有交点的 ...

  7. 题解 Luogu P3623 [APIO2008]免费道路

    [APIO2008]免费道路 题目描述 新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可 ...

  8. [题解]luogu P4116 Qtree3

    终于来到了Qtree3, 其实这是Qtree系列中最简单的一道题,并不需要线段树, 只要树链剖分的一点思想就吼了. 对于树链剖分剖出来的每一根重链,在重链上维护一个Set就好了, 每一个Set里存的都 ...

  9. 题解 Luogu P3959 【宝藏】

    来一篇不那么慢的状压??? 话说这题根本没有紫题难度吧,数据还那么水 我是不会告诉你我被hack了 一看数据规模,n≤12,果断状压. 然后起点要枚举,就设dp状态: f[i][j]=以i为起点到j状 ...

随机推荐

  1. CentOS6.5安装zookeeper-3.4.5(单机)

    1.下载 下载链接:http://archive.apache.org/dist/zookeeper/ 本文下载版本:zookeeper-3.4.5.tar.gz 2.安装 安装目录:/usr/loc ...

  2. LightGBM调参总结

    1. 参数速查 使用num_leaves,因为LightGBM使用的是leaf-wise的算法,因此在调节树的复杂程度时,使用的是num_leaves而不是max_depth. 大致换算关系:num_ ...

  3. vue中使用echarts

    1.下载依赖 cnpm i echarts -S 2.模块中引入 <template> <div class="analyzeSystem"> <di ...

  4. sqli-labs(三)

    第五关:这关的重点是有联合查询的注入漏洞,但是页面不会显示查询信息,但是会有报错信息显示在页面上 这关是双查询注入,其实用报错注入和盲注都是可以注入的,但是我觉得这个双查询注入还是很有意思的,所以这关 ...

  5. VS2010和选中代码相同的代码的颜色设置,修改高亮颜色

    使用Visual Studio 2010, 发现很难看清非活动的选中代码,研究了下,发现以下方法可以设置: 1. 菜单:工具  -> 选项  ->环境  ->字体和颜色 2. 在右边 ...

  6. jQuery-点击查看联系方式

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. redis的key越来越多,对速度是否有影响

    ---恢复内容开始--- redis存储key是用字典对象的,查询性能几乎和数量级无关,只要保证内存够用就可以了,如果内存不够,会把内存和swap空间交换,这种情况下就会很影响性能,会读取出现读取磁盘 ...

  8. memory consistency

    目前的计算机系统中,都是shared memory结构,提供统一的控制接口给软件, shared memory结构中,为了memory correctness,可以将问题分为:memory consi ...

  9. php高并发,大流量

    一般使用LVS+PHP集群(1000台),就算日均80亿次请求,每秒有10万并发,那分到每台机器的请求只有100个.只要你的PHP程序不是太差,100QPS总没问题吧? 而真正的瓶颈在于数据库和存储系 ...

  10. Real Time Credit Card Fraud Detection with Apache Spark and Event Streaming

    https://mapr.com/blog/real-time-credit-card-fraud-detection-apache-spark-and-event-streaming/ Editor ...