题目

在一个平面直角坐标系中,有 \(n\) 个黑点,\(n\) 个白点。

给出一种二分图匹配的方案,使得没有两条由黑白点连接的线段相交


分析

如果线段都不相交,根据三角形的两边之和大于第三边,那么线段的长度之和一定是最小的。

那么这道题就转化成二分图最大权完美匹配,用KM算法写就可以了。


代码

#include <cstdio>
#include <cctype>
#include <cmath>
#include <queue>
using namespace std;
const int N=111; bool vx[N],vy[N];
typedef double db; queue<int>q;
db slack[N],lx[N],ly[N],G[N][N];
int px[N],py[N],link[N],n,x[N],y[N];
int iut(){
int ans=0,f=1; char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans*f;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
db min(db a,db b){return a<b?a:b;}
db max(db a,db b){return a>b?a:b;}
void adjust(int y){
for (int _y;y;y=_y){
_y=px[link[y]];
px[link[y]]=y;
py[y]=link[y];
}
}
void bfs(int st){
for (int i=1;i<=n;++i) slack[i]=1e12,vx[i]=vy[i]=0;
while (!q.empty()) q.pop();
q.push(st);
while (1){
while (!q.empty()){
int x=q.front();
vx[x]=1,q.pop();
for (int y=1;y<=n;++y)
if (!vy[y]&&slack[y]>lx[x]+ly[y]-G[x][y]){
slack[y]=lx[x]+ly[y]-G[x][y],link[y]=x;
if (!slack[y]){
vy[y]=1;
if (!py[y]) {adjust(y); return;}
else q.push(py[y]);
}
}
}
db mn=1e12;
for (int i=1;i<=n;++i)
if (!vy[i]) mn=min(mn,slack[i]);
for (int i=1;i<=n;++i){
if (vx[i]) lx[i]-=mn;
if (vy[i]) ly[i]+=mn;
else slack[i]-=mn;
}
for (int i=1;i<=n;++i)
if (!vy[i]&&!slack[i]){
vy[i]=1;
if (!py[i]) {adjust(i); return;}
else q.push(py[i]);
}
}
}
void KM(){
for (int i=1;i<=n;++i){
link[i]=ly[i]=px[i]=py[i]=0,lx[i]=-1e12;
for (int j=1;j<=n;++j)
lx[i]=max(lx[i],G[i][j]);
}
for (int i=1;i<=n;++i) bfs(i);
}
int o(int x){return x*x;}
int main(){
while (scanf("%d",&n)==1){
for (int i=1;i<=n;++i)
x[i]=iut(),y[i]=iut();
for (int j=1;j<=n;++j){
int X=iut(),Y=iut();
for (int i=1;i<=n;++i)
G[i][j]=-sqrt(o(X-x[i])+o(Y-y[i]));
}
KM();
for (int i=1;i<=n;++i)
print(px[i]),putchar(10);
putchar(10);
}
return 0;
}

#KM算法#UVA1411 Ants的更多相关文章

  1. 【POJ3565】ANTS KM算法

    [POJ3565]ANTS 题意:平面上有2*n个点,N白N黑.为每个白点找一个黑点与之连边,最后所有边不交叉.求一种方案. 题解:KM算法真是一个神奇的算法,虽然感觉KM能做的题用费用流都能做~ 本 ...

  2. poj3565 Ants km算法求最小权完美匹配,浮点权值

    /** 题目:poj3565 Ants km算法求最小权完美匹配,浮点权值. 链接:http://poj.org/problem?id=3565 题意:给定n个白点的二维坐标,n个黑点的二维坐标. 求 ...

  3. ACM学习历程—POJ3565 Ants(最佳匹配KM算法)

    Young naturalist Bill studies ants in school. His ants feed on plant-louses that live on apple trees ...

  4. UVALive 4043 Ants 蚂蚁(二分图最佳完美匹配,KM算法)

    题意: 有n个蚂蚁n棵树,蚂蚁与树要配对,在配对成功的一对之间连一条线段,要求所有线段不能相交.按顺序输出蚂蚁所匹配的树. 思路: 这个题目真是技巧啊,不能用贪心来为每个蚂蚁选择最近的树,这样很可能是 ...

  5. poj 3565 uva 1411 Ants KM算法求最小权

    由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了…… 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...

  6. 训练指南 UVALive - 4043(二分图匹配 + KM算法)

    layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...

  7. 匈牙利算法与KM算法

    匈牙利算法 var i,j,k,l,n,m,v,mm,ans:longint; a:..,..]of longint; p,f:..]of longint; function xyl(x,y:long ...

  8. 【HDU2255】奔小康赚大钱-KM算法

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...

  9. HDU2255-奔小康赚大钱-二分图最大权值匹配-KM算法

    二分图最大权值匹配问题.用KM算法. 最小权值的时候把权值设置成相反数 /*-------------------------------------------------------------- ...

  10. KM算法及其优化的学习笔记&&bzoj2539: [Ctsc2000]丘比特的烦恼

    感谢  http://www.cnblogs.com/vongang/archive/2012/04/28/2475731.html 这篇blog里提供了3个链接……基本上很明白地把KM算法是啥讲清楚 ...

随机推荐

  1. leetcode 平衡二叉树

    给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 . 示例 1: 输入:root = [3,9,20,n ...

  2. 安装Standalone模式HBase

    所谓Standalone模式HBase,就是只启动一个JVM进程,在这个进程中同时启动了多个后台角色,如:HMaster,单个HRegionServer,以及ZooKeeper服务. 下载安装 最新版 ...

  3. 并发慎用——System.currentTimeMillis()

    好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受. System.currentTimeMillis()是极其常用的基础Java API,广泛地用来获取时间戳或测量代码 ...

  4. 一分钟带你了解mySql执行SQL的内部原理

    1.把MySQL当个黑盒子一样执行SQL语句 我们知道执行了insert语句之后,在表里会多出来一条数据:执行了update语句之后,会对表里的数据进行更改:执行了delete语句之后,会把表里的一条 ...

  5. 08、Etcd 中MVCC原理

    本篇内容主要来源于自己学习的视频,如有侵权,请联系删除,谢谢. 1.什么是 MVCC MVCC(Multiversion concurrency control)是一个基于多版本技术实现的一种并发控制 ...

  6. Vue3基础知识提炼

    1.{{}} data2.""等同{{}},数据单向绑定v-bind: 简化 :3.v-if v-else4.v-for="(i, index) in array&quo ...

  7. 【Azure 应用服务】添加自定义域时,Domain ownership 验证无法通过 

    问题描述 在Azure App Service添加自定义域名时,遇见了Domain ownership 验证无法通过的问题? 问题解决 因为DNS中配置App Service默认域名和自定义域名的CN ...

  8. 基于 Nebula Graph 构建图学习能力

    本文首发于 Nebula Graph Community 公众号 经常看技术文章的小伙伴可能会留意到除了正在阅读的那篇文章,在文章页面的正文下方或者右侧区域会有若干同主题.同作者的文章等你阅读:经常逛 ...

  9. 国内RPA融资年终大盘点:19起投资总额破34亿估值近230亿,垂直落地之年开启

    2021国内RPA融资年终盘点:15家厂商融资总额破34亿,估值近230亿 2021RPA融资年终大盘点:19起投资估值近230亿,垂直落地之年开启 2021国内RPA融资年终盘点:15家厂商19起投 ...

  10. 各大OA调试账户默认账户口令

    1.今目标地址:http://web.jingoal.com/mgt/用户名:admin@8216261密码:1a2s3d4f5g2.IBOS博思协同地址:http://demo.ibos.com.c ...