实用指南:UVa 10228 A Star not a Tree?

news/2025/11/13 13:36:45/文章来源:https://www.cnblogs.com/ljbguanli/p/19217812

实用指南:UVa 10228 A Star not a Tree?

题目描述

卢克想要将他的家庭计算机网络从10mbs\texttt{10mbs}10mbs 升级到 100mbs\texttt{100mbs}100mbs。他现有的网络运用10base2\texttt{10base2}10base2(同轴)电缆,可能将任意数量的计算机以线性方式连接在一起。不幸的是,卢克无法使用现有的布线。100mbs\texttt{100mbs}100mbs 系统使用 100baseT\texttt{100baseT}100baseT(双绞线)电缆,每条电缆只能连接两个设备。

卢克选择了第二种方案:购买NNN张网卡和一个集线器(hub\texttt{hub}hub),并将他的NNN通过台计算机分别连接到集线器上。卢克能够随意布置电缆和放置集线器的位置,但计算机的位置是固定的。他想要最小化需要购买的电缆总长度。

输入格式

第一行包含测试用例的数量,后面跟着一个空行。

每个测试用例以一个正整数N≤100N \leq 100N100(计算机的数量)开始,后面跟着NNN行,每行给出计算机在房间内的(x,y)(x, y)(x,y)坐标(单位为mm\texttt{mm}mm)。所有坐标都是000100001000010000之间的整数。

连续测试用例之间有一个空行。

输出格式

对于每个测试用例,输出一个数字,表示电缆段的总长度(四舍五入到最近的mm\texttt{mm}mm),单独占一行。

连续两个测试用例之间输出一个空行。

题目分析

问题本质

这个问题可以抽象为:在平面上给定NNN个点(计算机的位置),需要找到一个点(集线器的位置),使得该点到所有给定点的欧几里得距离之和最小。

这实际上是一个经典的费马-韦伯问题Fermat-Weber problem\texttt{Fermat-Weber problem}Fermat-Weber problem),也称为几何中位数geometric median\texttt{geometric median}geometric median)问题。

数学模型

给定 NNN 个点 Pi=(xi,yi)P_i = (x_i, y_i)Pi=(xi,yi),我们需要找到一个点H=(hx,hy)H = (h_x, h_y)H=(hx,hy),使得目标函数最小化:

f(hx,hy)=∑i=1N(hx−xi)2+(hy−yi)2 f(h_x, h_y) = \sum_{i=1}^N \sqrt{(h_x - x_i)^2 + (h_y - y_i)^2}f(hx,hy)=i=1N(hxxi)2+(hyyi)2

与质心(所有点的平均值)不同,几何中位数没有封闭形式的解析解,需要使用数值方法求解。

算法选择

我们使用 韦茨菲尔德算法Weiszfeld’s algorithm\texttt{Weiszfeld's algorithm}Weiszfeld’s algorithm)来求解几何中位数。该算法是一个迭代算法,主要思想如下:

  1. 初始化:将几何中位数的初始估计值设为所有点的质心
  2. 迭代更新:根据当前估计值,使用加权平均来更新几何中位数的位置
  3. 收敛判断:当位置变化很小时停止迭代

迭代公式为:

H(k+1)=∑i=1NPi∥H(k)−Pi∥∑i=1N1∥H(k)−Pi∥ H^{(k+1)} = \frac{\sum_{i=1}^N \frac{P_i}{\|H^{(k)} - P_i\|}}{\sum_{i=1}^N \frac{1}{\|H^{(k)} - P_i\|}}H(k+1)=i=1NH(k)Pi1i=1NH(k)PiPi

其中 ∥H(k)−Pi∥\|H^{(k)} - P_i\|H(k)Pi表示当前估计点H(k)H^{(k)}H(k) 到点 PiP_iPi的欧几里得距离。

算法细节

  1. 初始值选择通过:将初始几何中位数设为所有点的质心,这样能够加速收敛
  2. 数值稳定性:当几何中位数与某个数据点重合时,分母可能为零,需要特殊处理
  3. 收敛条件:当连续两次迭代的位置变化小于某个阈值,或者达到最大迭代次数时停止
  4. 精度处理:最终结果要求四舍五入到最接近的毫米

复杂度分析

参考代码

// A Star not a Tree?
// UVa ID: 10228
// Verdict: Accepted
// Submission Date: 2025-10-16
// UVa Run Time: 0.000s
//
// 版权所有(C)2025,邱秋。metaphysis # yeah dot net
#include <iostream>#include <vector>#include <cmath>#include <iomanip>using namespace std;// 点结构体,表示二维坐标struct Point {double x, y;Point(double x = 0, double y = 0) : x(x), y(y) {}};// 计算两点间的欧几里得距离double distance(const Point& a, const Point& b) {return hypot(a.x - b.x, a.y - b.y);}// 使用Weiszfeld算法计算几何中位数Point geometricMedian(const vector<Point>& points, int maxIterations = 200) {int n = points.size();// 初始点设为所有点的质心(平均值)Point median;for (const auto& p : points) {median.x += p.x;median.y += p.y;}median.x /= n;median.y /= n;// Weiszfeld算法迭代for (int iter = 0; iter < maxIterations; iter++) {Point numerator(0, 0);  // 分子部分double denominator = 0; // 分母部分// 计算加权平均的分子和分母for (const auto& p : points) {double dist = distance(median, p);if (dist < 1e-12) {// 如果距离太小(接近某个数据点),跳过避免除零continue;}numerator.x += p.x / dist;numerator.y += p.y / dist;denominator += 1.0 / dist;}// 如果分母为零,说明几何中位数与某个数据点重合if (denominator == 0) {break;}// 计算新的几何中位数估计Point newMedian(numerator.x / denominator, numerator.y / denominator);// 检查是否收敛(位置变化很小)if (distance(newMedian, median) < 1e-12) {break;}// 更新几何中位数median = newMedian;}return median;}int main() {int cases;cin >> cases;bool firstCase = true;while (cases--) {int n;cin >> n;vector<Point> computers(n);for (int i = 0; i < n; i++) {cin >> computers[i].x >> computers[i].y;}// 计算几何中位数(最优集线器位置)Point hub = geometricMedian(computers);// 计算总电缆长度double totalLength = 0;for (const auto& computer : computers) {totalLength += distance(hub, computer);}// 输出结果(四舍五入到最近的整数)if (!firstCase) {cout << endl;}firstCase = false;cout << static_cast<int>(round(totalLength)) << endl;}return 0;}

总结

本题通过几何中位数的概念和韦茨菲尔德算法,有效地解决了最优集线器放置问题。关键点在于:

  1. 理解问题本质是寻找使总距离最小的点
  2. 掌握韦茨菲尔德算法的原理和实现
  3. 注意数值稳定性和收敛条件处理
  4. 正确处理输入输出格式要求

该算法对于 N≤100N \leq 100N100的规模非常高效,能够在合理时间内找到高质量的近似解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/964265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware ESXi 8.0U3g 集成 RTL8111 / RTL8125 / RTL8126 / RTL8127 网卡驱动定制版

VMware ESXi 8.0U3g 集成 RTL8111 / RTL8125 / RTL8126 / RTL8127 网卡驱动定制版ESXi 8.0U3g Realtek 网卡(RTL8111 / RTL8125 / RTL8126 / RTL8127)定制版 VMware ESXi 8.0U3g macOS Unlocker & OEM BIOS 2.7 …

VMware ESXi 9.0.1.0 集成 RTL8111 / RTL8125 / RTL8126 / RTL8127 网卡驱动定制版

VMware ESXi 9.0.1.0 集成 RTL8111 / RTL8125 / RTL8126 / RTL8127 网卡驱动定制版ESXi 9.0.1.0 Realtek 网卡(RTL8111 / RTL8125 / RTL8126 / RTL8127)定制版 VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2…

2025年市面上最佳商标注册服务商Top 5排名与深度评测

摘要 商标注册行业在2025年持续快速发展,随着知识产权保护意识的提升,企业对于专业商标服务的需求日益增长。本文基于行业数据和用户反馈,精选出当前市场上top 5的商标注册服务商,并提供排名表单供参考,帮助用户选…

2025年商标注册服务商综合评测:五大权威机构深度解析

摘要 随着知识产权保护意识的提升,2025年中国商标注册行业迎来快速发展期,市场规模预计突破千亿元。企业在选择商标注册服务商时需综合考虑专业能力、服务质量和成功案例。本文基于权威数据采集和用户口碑调研,为您…

基于微信小应用的垃圾分类管理系统【2026最新】

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Solon Web 的“分身术”:单应用多端口监听,化身多重服务

该方案为复杂业务场景下的服务部署提供了灵活而高效的解决方案,既保证了服务间的逻辑隔离,又实现了资源的有效利用。一、概述 常规 Solon Web 应用通常采用单一端口提供服务。然而在实际业务场景中,我们往往需要单个…

2025-11-12 PQ v.Next日志记录

2025-11-12 PQ v.Next日志记录 重新pull下来最新的代码做进一步的修改。 https://z.gitee.cn/zgca/projects/777586/repos/zgca/aipq/sources今日进度(3*4):基于课堂收集用户的反馈; 本地仓库与远程仓库代码对齐。…

完整教程:人体心率测量技术

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

如何在WPF中实现ComboBox多选 - 教程

如何在WPF中实现ComboBox多选 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

内江低噪音西林瓶灌装轧盖机选型,适配洁净车间

在当前制药装备领域,洁净车间对设备运行噪音、无菌保障能力及自动化集成度的要求日益提升,尤其在西林瓶灌装环节,低噪音、高洁净适配性已成为选型核心指标。面对多样化的市场需求,业内企业纷纷优化产品结构,以满足…

week3task

实践报告 1.按照动态规划法的求解步骤分析作业题目“数字三角形”: 1.1 递归方程: dp[i][j]=triangle[i][j]+max(dp[i+1][j], dp[i+1][j+1]) 方程的定义:dp[i][j] 表示从位置 (i, j) 出发到达底部所能得到的最大路径…

trick 选记

拆贡献:数值贡献,所有值之和等于对于所有 i 求出 >=i 的个数求和(数值转 01)。 个体 -> 整体,一般可以考虑的有全局,操作,和操作所影响的更小的个体(或就是单独的个体)(这启示我们要多角度思考问题的本…

Python 元组Tuple 简介

元组Tuple 元组(Tuple)是Python中的一种不可变序列类型,用于存储多个有序的元素。一旦创建,元组的内容就不能被修改。 特点不可变性:元组一旦创建,不能修改其元素 有序性:元组中的元素保持插入顺序 元组可以包含…

网络串流 —— 地址

网络串流 —— 地址音频: BBC News: https://stream.live.vc.bbcmedia.co.uk/bbc_world_service视频:本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份…

抗体人源化技术:治疗性抗体的迭代升级与临床突破

抗体作为能与抗原特异性结合的免疫球蛋白,是免疫系统的核心组成部分,在疾病预防与治疗中占据不可替代的地位。人类对抗体治疗的探索有着深厚的历史积淀,中国唐朝便已有种痘预防天花的记载,这一 “人痘接种术” 被公…

【日记】这个健身器材是真要命了(934 字)

正文今天上午发电机的人来巡检。尝试启动时没反应过来,被柴油燃烧的青烟窜了一脸。眼睛疼到现在。我能不能报工伤啊呜呜。今天又把事情拖到最后一天赶 DDL 呢,明天又有一些事情是 DDL。感觉自己懒得不行(笑。做完了…

Zabbix 配置中文界面、监控告警以及Windows、Linux主/被监控模板

Zabbix 配置中文界面、监控告警以及Windows、Linux主/被监控模板本次优化主要针对 Zabbix 监控配置文章进行结构化梳理与格式规范:一是重构内容框架,将 Linux 与 Windows 监控配置分离呈现,前置主动 / 被动检查核心…

算法-快速排序和归并排序

算法 快速排序 归并排序1. 快排 2. 归并排序最好情况、最坏情况、平均情况,时间复杂度都为\(O(nlogn)\) 空间复杂度为\(O(n)\)。归并排序不是原地排序算法,需要额外的空间来存储tmp数组。public static void mergeSo…

记一次 .NET 某理财管理客户端 OOM溢出分析

一:背景 1. 讲故事 这是训练营里的学员找到我的,让我帮忙看下为什么他的客户程序会偶发的出现 报错弹框,由于dump比较敏感,这里就不截图发出来了,由于是错误弹框,并不会出现程序崩溃,而且朋友在日志中也看到了 …

计算机毕业设计:Python农业数据可视化分析系统 气象数据 农业生产 粮食素材 播种数据 爬虫 Django框架 天气数据 降水量(源码+文档)✅

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …