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只蚂蚁, 这些蚂蚁开始可以任意朝着一个方向移动一直走,向左或是向右,并且移动速度是相同的,但是一旦蚂蚁碰到迎面走来的另一只蚂蚁,那么这两只蚂 ...
随机推荐
- python列表操作符
list1=[123,456] list2=[234,234] list1>list2 >>>False#返回False 第一项比较之后直接返回false,第二项不看 #+实现 ...
- nginx配置防盗链
location ~* \.(gif|jpg|swf|flv|mp3|mp4|zip|rar)$ { root /home/soft; valid_referers *.qinyj.top downl ...
- 在react中引入下拉刷新和上拉加载
1. 首先引入插件 import ReactPullLoad, {STATS} from 'react-pullload' 2. 初始化: constructor(props) { super(pro ...
- 如何正确使用Java异常处理机制
文章来源:leaforbook - 如何正确使用Java异常处理机制作者:士别三日 第一节 异常处理概述 第二节 Java异常处理类 2.1 Throwable 2.1.1 Throwable有五种构 ...
- WEB 表格测试点
Web页面的表格测试点: 1.表格列名 2.表格翻页.表格跳转到多少页.最后一页.首页 3.表格每页显示的数据, 数据的排序 4.表格无数据 5.表格支持的最大数据量 6.表格中数据内容超长时,显示是 ...
- setContentView()与LayoutInflater.inflate()作用
@Override protected void onCreate(Bundle savedInstanceState) { try{ super.onCreate(savedInstanceS ...
- iOS 代码开发规范
最近公司因为业务增多,又招了一个iOS小伙伴,内心无比开心呀.但是多了一个人,日常代码开发就要统一规范起来,方便日后维护和查找.下边列一下我日常用到一些代码规范. (一).SVN规范 1.代码一定要先 ...
- 2017-2018-1 Java演绎法 第八周 作业
团队任务:UML设计 团队组长:袁逸灏 本次编辑:刘伟康 团队分工 第一次使用泳道图,感觉非常方便,从图中的箭头和各个活动框中可以清晰地看出分工流程: 不过既然是博客园,分工就不能只贴图,markdo ...
- Bate版敏捷冲刺报告--day0
1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285) Git链接:https://github.com/WHUSE2017/C-team 2 ...
- RxSwift:ReactiveX for Swift 翻译
RxSwift:ReactiveX for Swift 翻译 字数1787 阅读269 评论3 喜欢3 图片发自简书App RxSwift | |-LICENSE.md |-README.md |-R ...