uva 1411 Ants
题意:
一个平面上有n个黑色的点,n个白色的点,要求黑色的点与白色点之间一一配对,且线段之间不相交。
思路:
线段不相交并不好处理,想了很久想不出,所以看了蓝书的讲解。
一个很明显的结论是,不相交的线段一定比相交的线段短,如图:一个较为直观的例子。

由于点之间一一对应,所以肯定用二分图匹配,然后要使得所有线段之和最短,那么就是求一个带权最小匹配,上KM算法解决。
把所有的边权取负值,求最大匹配即可。
代码:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std; const int N = ; double mp[N][N]; struct node
{
double x,y;
node(double a,double b)
{
x = a;
y = b;
}
}; vector<node> nx,ny; bool vis_x[N],vis_y[N];
int match[N];
double lx[N],ly[N];
double slack[N];
int ma[N]; double cal(int i,int j)
{
double dx = pow(nx[i].x - ny[j].x,);
double dy = pow(nx[i].y - ny[j].y,); return sqrt(dx + dy);
} bool dfs(int u,int n)
{
vis_x[u] = ; for (int i = ;i < n;i++)
{
if (vis_y[i]) continue; double gap = lx[u] + ly[i] - mp[u][i]; //getchar(); //printf("%.6f %.6f %.6f %.6f\n",lx[u],ly[i],mp[u][i],gap); if (fabs(gap) < 1e-)
{
vis_y[i] = ; if (match[i] == - || dfs(match[i],n))
{
match[i] = u;
return true;
}
}
else
{
slack[i] = min(slack[i],gap);
}
} return false;
} void km(int n)
{
memset(ly,,sizeof(ly));
memset(match,-,sizeof(match)); for (int i = ;i < n;i++)
{
lx[i] = mp[i][]; for (int j = ;j < n;j++)
{
lx[i] = max(lx[i],mp[i][j]);
}
} for (int i = ;i < n;i++)
{
for (int j = ;j < n;j++) slack[j] = 1e15;
//printf("gg");
while ()
{
//printf("233");
memset(vis_x,,sizeof(vis_x));
memset(vis_y,,sizeof(vis_y)); if (dfs(i,n)) break; double d = 1e15; for (int j = ;j < n;j++)
{
if (!vis_y[j]) d = min(slack[j],d);
} for (int j = ;j < n;j++)
{
if (vis_x[j]) lx[j] -= d; if (vis_y[j]) ly[j] += d;
} //getchar(); //printf("%.6f **\n",d);
}
}
} int main()
{
int n;
int kase = ; while (scanf("%d",&n) != EOF)
{
if (kase++) printf("\n"); nx.clear();
ny.clear(); for (int i = ;i < n;i++)
{
double x,y;
scanf("%lf%lf",&x,&y); nx.push_back(node(x,y));
} for (int i = ;i < n;i++)
{
double x,y;
scanf("%lf%lf",&x,&y); ny.push_back(node(x,y));
} for (int i = ;i < n;i++)
{
for (int j = ;j < n;j++)
{
mp[i][j] = -cal(i,j);
}
} km(n); for (int i = ;i < n;i++)
{
int a = i + ,b = match[i] + ;
ma[b] = a;
} for (int i = ;i < n;i++)
{
printf("%d\n",ma[i+]);
}
} return ;
}
uva 1411 Ants的更多相关文章
- UVA 1411 - Ants(二分图完美匹配)
UVA 1411 - Ants 题目链接 题意:给定一些黑点白点,要求一个黑点连接一个白点,而且全部线段都不相交 思路:二分图完美匹配,权值存负的欧几里得距离,这种话,相交肯定比不相交权值小,所以做一 ...
- uva 1411 Ants (权值和最小的完美匹配---KM算法)
uva 1411 Ants Description Young naturalist Bill studies ants in school. His ants feed on plant-louse ...
- poj 3565 uva 1411 Ants KM算法求最小权
由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了…… 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...
- 【uva 1411 Ants蚂蚁们】
题目大意: ·给你一个n,表示输入n个白点和n个黑点(输入每一个点的坐标).现在需要将各个白点和各个黑点一一用线段连接起来,需要满足这些线段不能够相交. ·特色: 我们如何保证线段间不相交. ·分析: ...
- UVa 1411 Ants(分治)
https://vjudge.net/problem/UVA-1411 题意:n只蚂蚁和n颗苹果树,一一配对并且不能交叉. 思路:这就是巨人与鬼的问题.用分治法就行了. #include<ios ...
- 【UVA 1411】 Ants (KM)
Young naturalist Bill studies ants in school. His ants feed onplant-louses that live on apple trees. ...
- UVA 10714 Ants 蚂蚁 贪心+模拟 水题
题意:蚂蚁在木棍上爬,速度1cm/s,给出木棍长度和每只蚂蚁的位置,问蚂蚁全部下木棍的最长时间和最短时间. 模拟一下,发现其实灰常水的贪心... 不能直接求最大和最小的= =.只要求出每只蚂蚁都走长路 ...
- Ants UVA - 1411(km板题竟然让我换了个板子)
题意: 给出n个白点和n个黑点的坐标,要求用n条不相交的线段把它们连接起来,其中每条线段恰好连接一个白点和一个黑点,每个点恰好连接到一条线段 解析: 带入负的欧几里得距离求就好了 假设a1-b1 与 ...
- uva 10714 Ants(贪心)
题目连接:10714 - Ants 题目大意:一根棍子上有n只蚂蚁, 这些蚂蚁开始可以任意朝着一个方向移动一直走,向左或是向右,并且移动速度是相同的,但是一旦蚂蚁碰到迎面走来的另一只蚂蚁,那么这两只蚂 ...
随机推荐
- 如何在IPFS里面上传一张图片
之前有好几人问过小编,想在IPFS里面上传一张图片.如何做? 今天小编就讲一下如何在IPFS里面上传.下载文件? 1 下载IPFS软件 下载地址:https://dist.ipfs.io/#go-ip ...
- ------- Tor 源码分析第三部分—— 日志设施与智能链表 --------
------------------------------------------------------------------------------------ init_logging()( ...
- Webpack的基本配置
一.优化项目结构,创建相关的文件,项目结构如下:src文件夹存放相关js文件,index.html项目的首页面,dist文件夹是webpack 打包 目录. index.js内容为: alert('我 ...
- 基于 IJKPlayer-concat 协议的视频无缝拼接技术实现
一.前言 Hi,大家好,我是承香墨影! 开门见山,开篇名义.今天来聊聊如何将多段视频,拼接成一个完整而连续的视频,然后无缝进行播放. 这样的需求应该不算偏门吧? 最简单的就是一些视频 App,会将大段 ...
- Java基础学习笔记十九 IO
File IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再 ...
- 201621123057 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 接口,interface,implements,方法签名,has-a,Comparable,Comparator. 1.2 尝试 ...
- fflush(stdin)与fflush(stdout)
1.fflush(stdin): 作用:清理标准输入流,把多余的未被保存的数据丢掉.. 如: int main() { int num; char str[10]; cin>>num; c ...
- XCode Build Settings中几种Search Paths
Header search path:去查找头文件的路径,同在在你需要使用第三方库的时候,在这里设置你的头文件路径目录,如图 <code><span class="str& ...
- 亚马逊的PuTTY连接AWS出现network error connection refused,终极解决方案。
使用PuTTY连接AWS的时候,一直出现network error connection refused.百度了这个问题,大家都说是SSH要设置成22.但是我已经设置过了,为什么还是遇到这个问题呢? ...
- Flask 学习 十二 用户评论
评论在数据库中的表示 由于评论和2个模型有关系,分别是谁发了评论,以及评论了哪个文章,所以这次要更新数据库模型 models.py 创建用户评论数据库模型 class Comment(db.Model ...