UVA1411 Ants
时间:2019-10-06
本文章向大家介绍UVA1411 Ants,主要包括UVA1411 Ants使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
\(\mathtt{UVA 1411}\) \(\mathtt{Ants}\)
\(\mathcal{Description}\)
给定一些黑点白点,要求一个黑点连接一个白点,并且所有线段都不相交。
\(\mathcal{Solution}\)
首先通过画图可以发现,要使所有线段都不相交可以使距离总和最小。所以题意就转化成为使距离总和最小的连接方式,自然联想到\(KM\)。我们可以先预处理出每一对白点和黑点之间的距离,因为要求的是最小连接方式,所以可以把距离取反来求最大值,限制条件为\(g[i] + b[i] = a[i][j]\),\(a[i][j]\)是取反后的距离,\(g[i]\)是黑点的期望值,\(b[i]\)是白点的期望值,复杂度为\(O(n^3)\)。
\(\mathcal{Code}\)
#include<bits/stdc++.h>
using namespace std;
const int N = 110, INF = 1 << 30, Eps = 1e-9;
bool tfg[N], tfb[N];
int match[N], n,cnt ;
double a1[N], b1[N], a2[N], b2[N], a[N][N], b[N], g[N];
inline int read() {
int x = 0, k = 1; char c = getchar();
for (; c < 48 || c > 57; c = getchar()) k ^= (c == '-');
for (; c >= 48 && c <= 57; c = getchar()) x = x * 10 + (c ^ 48);
return k ? x : -x;
}
bool pd(int x) {
tfg[x] = true;
for (int i = 1; i <= n; i++)
if (fabs(g[x] + b[i] - a[x][i]) < Eps && !tfb[i]) {
tfb[i] = true;
if (match[i] == -1) {
match[i] = x;
return true;
}
if (pd(match[i])) {
match[i] = x;
return true;
}
}
return false;
}
inline void KM() {
memset(match, -1, sizeof(match));
memset(b, 0.0, sizeof(b));
for (int i = 1; i <= n; i++) {
g[i] = std::max(0.0, a[i][1]);
for (int j = 2; j <= n; j++)
g[i] = std::max(g[i], a[i][j]);
}
for (int i = 1; i <= n; i++) {
while (true) {
//printf("%d KM\n",i);
memset(tfb, false, sizeof(tfb));
memset(tfg, false, sizeof(tfg));
if (pd(i))
break;
double d = INF;
for (int j = 1; j <= n; j++)
if (tfg[j])
for (int k = 1; k <= n; k++)
if (!tfb[k])
d = std::min(d, g[j] + b[k] - a[j][k]);
// if (cnt<=5) printf("%d %.2lf YES\n",i,d);
for (int j = 1; j <= n; j++) {
if (tfg[j])
g[j] -= d;
if (tfb[j])
b[j] += d;
}
// if (i==1 && cnt<=5) for (int j=1; j<=n; j++) printf("%d %.2lf %.2lf\n",j,g[j],b[j]);
// cnt++;
}
}
}
inline double dist(double x, double y, double xx, double yy) {
return sqrt((x - xx) * (x - xx) + (y - yy) * (y - yy));
}
int main() {
while (scanf("%d", &n) != EOF) {
for (int i = 1; i <= n; i++)
scanf("%lf%lf", &a1[i], &b1[i]);
for (int i = 1; i <= n; i++)
scanf("%lf%lf", &a2[i], &b2[i]);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
a[j][i] = -dist(a1[i], b1[i], a2[j], b2[j]);
KM();
for (int i = 1; i <= n; i++)
printf("%d\n", match[i]);
}
return 0;
}
原文地址:https://www.cnblogs.com/wjnclln/p/11627394.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux下的定时任务处理
- 10 个用纯 Javascript 实现的好用插件
- Tensorflow ActiveFunction激活函数解析
- C++核心准则Con.1:默认情况下使对象不可修改
- 进化算法个体和指标的一致性
- matlab代码折叠与分节注释
- Flask从零到一 1 | 虚拟环境和第一个flask程序
- 按照元素指定条件筛选结构体数组
- 多目标优化按支配关系分层实现
- CentOS 7 解决丢失 nginx.pid
- $(function(){})和$(document).ready(function(){})
- javascript中的setTimeout() 方法和clearInterval() 方法和setInterval() 方法
- matlab生成数字1-n的列向量
- JavaScript中的匿名函数及函数的闭包
- ios下Safari无法触发click事件的处理