【洛谷题解/AcWing题解】USACO2.4 洛谷P1522 牛的旅行
本文很长但是讲的很通俗了。题目链接洛谷链接https://www.luogu.com.cn/problem/P1522AcWing链接https://www.acwing.com/problem/content/1127/涉及知识1.图论与建图2.多源汇最短路和Floyed算法思路分析注意本题洛谷翻译和AcWing翻译有所不同洛谷要求新牧场直径最小值AcWing要求所有牧场最大直径的最小值。本文先按洛谷的翻译写最后再讲求AcWing要求的结果该如何做。第一部分厘清概念首先本题给出了很多概念我们先来逐一解析牧区一个点牧场很多个牧区组成一个牧场也就是点的连通块距离两点间的最短距离本题的距离是欧几里得距离这就是为什么本题底层逻辑上还是需要用最短路算法的原因直径牧场中最远的两个牧区的距离第二部分建图与预处理在正式求解之前我们需要思考如何建图。本题我们可以根据给定的领接矩阵若领接矩阵中G [ i ] [ j ] G[i][j]G[i][j]的值为 1那么就根据给定坐标求点i ii到j jj的距离 如果值为 0 则按照 Floyed 算法的规则赋值为 0 或正无穷。由于本题其后都需要使用“距离”我们先跑一遍 Floyed 算法求出数组d i s [ i ] [ j ] dis[i][j]dis[i][j]记录任意两点间的最短路即本题的距离。然后我们进一步思考新牧场的直径可能是怎样构成的我们连接的两点i ii和j jj是未连通的两点也就是说在连接时i ii和j jj应当分属两个不同的连通块A AA和B BB那么新牧场直径就有可能有三种情况情况一连通块A AA的直径即经过A AA内某一点的最远距离可能不经过点i ii情况二连通块B BB的直径即经过B BB内某一点的最远距离可能不经过点j jj情况三经过点i ii的最远距离 经过点j jj的最远距离 点i ii和 点j jj之间的路径长度注意到这三种情况都与从某一点出发的最远距离息息相关所以我们在跑完 Floyed 后用一个数组m a x d maxdmaxd来记录每一点的最远路径。第三部分结果的求解对于洛谷的翻译如果是要求解新牧场的直径的最小值我们只需要保证连接两点i ii和j jj时m a x d [ i ] m a x d [ j ] maxd[i]maxd[j]maxd[i]maxd[j]i ii和j jj的距离之和最小即可因为原有牧场的直径已经是固定的这个跨牧场的直径即上文的情况三是要大于等于所有原牧场的直径的最大值的否则无法构成直径。这也是本题最绕的地方。举个例子比如情况一的直径是 33情况二的直径是 44情况三我们求出最小是 44.5那么情况一和二无法构成直径而情况三我们已经求的是最小值也就求出了直径的最小值。而如果情况一的直径是 33情况二的直径是 44情况三求出来是 40那情况三就不可能成为直径直径的最小值为44。如果我们故意“施魔法”让情况三的数超过 33 和 44则又不满足对最小值的要求了。开个玩笑但就是这么个道理综上我们可以发现我们只需要保证先求情况三的最小值就一定可以在三者中找到直径的最小值。因此最后我们只需要分别把三种情况的直径求出来再取最大值就一定是直径的最小值了。对于 AcWing 的翻译求的是所有牧场的直径的最小值唯一的区别在于处理洛谷的翻译的题目我们是分了两种情况再连通块A AA和B BB中求直径因为必须是新生成的牧场。没有这条限制后我们则不需要在代码中特判当前点是否属于两个连通块直接求所有点的最远距离m a x d [ i ] maxd[i]maxd[i]再与m a x d [ i ] m a x d [ j ] maxd[i]maxd[j]maxd[i]maxd[j]i ii和j jj的距离之和取最大值即可。与网上其他做法相比本做法最大的优点在于不需要使用并查集等数据结构思路更为精练代码更为简洁可迁移性也很强。笔者水平有限若有错误和不足敬请指出AC代码洛谷版#includeiostream#includecstdio#includecmathusingnamespacestd;constintN200;constdoubleINF1e20;typedefpairdouble,doublePII;intn;doubledis[N][N],maxd[N];charG[N][N];PII farm[N];doubleget_dist(PII x,PII y){doubledxx.first-y.first,dyx.second-y.second;returnsqrt(dx*dxdy*dy);}voidfloyed(){for(intk1;kn;k){for(inti1;in;i){for(intj1;jn;j){dis[i][j]min(dis[i][j],dis[i][k]dis[k][j]);}}}return;}intmain(){cinn;for(inti1;in;i)cinfarm[i].firstfarm[i].second;for(inti1;in;i){for(intj1;jn;j)cinG[i][j];}for(inti1;in;i){for(intj1;jn;j){if(G[i][j]1)dis[i][j]get_dist(farm[i],farm[j]);elsedis[i][j]ij?0:INF;}}floyed();for(inti1;in;i){for(intj1;jn;j){if(dis[i][j]INF)maxd[i]max(maxd[i],dis[i][j]);}}//两点连成的最大直径的最小值doubleres1INF;inta0,b0;for(inti1;in;i){for(intj1;jn;j){if(dis[i][j]INF){if(res1maxd[i]get_dist(farm[i],farm[j])maxd[j]){res1maxd[i]get_dist(farm[i],farm[j])maxd[j];ai,bj;}}}}//在连通块A中doubleres20.0;for(inti1;in;i){//判断点i和点a是否连通如果连通则说明在同一连通块中//但是这里取的是maxd[i]所以不一定会经过点aif(dis[i][a]INF)res2max(res2,maxd[i]);}//在连通块B中doubleres30.0;for(inti1;in;i){//同上if(dis[i][b]INF)res3max(res3,maxd[i]);}printf(%.6lf,max(res1,max(res2,res3)));// cout endl res1 res2 res3;return0;}AcWing版将情况一和二合并直接求出所有点的m a x d [ i ] maxd[i]maxd[i]的最大值#includeiostream#includecstdio#includecmathusingnamespacestd;constintN200;constdoubleINF1e20;typedefpairdouble,doublePII;intn;doubledis[N][N],maxd[N];charG[N][N];PII farm[N];doubleget_dist(PII x,PII y){doubledxx.first-y.first,dyx.second-y.second;returnsqrt(dx*dxdy*dy);}voidfloyed(){for(intk1;kn;k){for(inti1;in;i){for(intj1;jn;j){dis[i][j]min(dis[i][j],dis[i][k]dis[k][j]);}}}return;}intmain(){cinn;for(inti1;in;i)cinfarm[i].firstfarm[i].second;for(inti1;in;i){for(intj1;jn;j)cinG[i][j];}for(inti1;in;i){for(intj1;jn;j){if(G[i][j]1)dis[i][j]get_dist(farm[i],farm[j]);elsedis[i][j]ij?0:INF;}}floyed();for(inti1;in;i){for(intj1;jn;j){if(dis[i][j]INF)maxd[i]max(maxd[i],dis[i][j]);}}//两点连成的最大直径的最小值doubleres1INF;inta0,b0;for(inti1;in;i){for(intj1;jn;j){if(dis[i][j]INF){if(res1maxd[i]get_dist(farm[i],farm[j])maxd[j]){res1maxd[i]get_dist(farm[i],farm[j])maxd[j];ai,bj;}}}}doubleres20.0;for(inti1;in;i){res2max(res2,maxd[i]);}printf(%.6lf,max(res1,res2));// cout endl res1 res2 res3;return0;}

相关新闻

游戏开发中的缓动函数应用与LayaAir实践

游戏开发中的缓动函数应用与LayaAir实践

1. 缓动函数在游戏开发中的核心价值在游戏开发中,动画效果直接影响用户体验的品质感。想象一下,当角色从一个位置移动到另一个位置时,如果只是机械地直线匀速运动,会显得非常生硬不自然。而通过缓动函数,我们可以实现加…

2026/10/7 10:56:37 阅读更多 →
Unity游戏模组加载器MelonLoader从零到精通:安装、配置与排错全指南

Unity游戏模组加载器MelonLoader从零到精通:安装、配置与排错全指南

1. 项目概述:为什么你需要掌握MelonLoader? 如果你是一个Unity游戏的深度玩家,尤其是那些支持模组(Mod)的PC游戏,那么你一定对“模组加载器”这个词不陌生。它就像一把万能钥匙,打开了游戏官方内…

2026/10/7 10:56:40 阅读更多 →
利用AI助手高效规划Monorepo大型功能:从架构设计到代码生成

利用AI助手高效规划Monorepo大型功能:从架构设计到代码生成

如果你正在管理一个包含多个微服务、前端应用、共享库和工具脚本的复杂项目,那么最近一定被这些问题困扰过:为什么每次修改一个共享库,都要手动更新十几个依赖它的服务?为什么新同事要花一整天才能把整个开发环境跑起来&#xff1…

2026/10/5 11:02:42 阅读更多 →

最新新闻

Android 15 BufferQueue源码深度解析:从状态机到底层原理

Android 15 BufferQueue源码深度解析:从状态机到底层原理

作为对这个系列一直追下来的读者,估计已经对 Android 图形显示栈的全貌不再陌生了。前几篇我们沿着应用进程到 SurfaceFlinger 的主线,把图形缓冲区是怎么流转、怎么合成、最终怎么上屏的框架搭了起来。但从这篇开始,我要把视角拉低一层&…

2026/10/7 10:57:46 阅读更多 →
hyperframe实战:HTTP/2二进制分帧层帧编解码与协议解析

hyperframe实战:HTTP/2二进制分帧层帧编解码与协议解析

做 HTTP/2 协议相关开发的人,多半会撞见 hyperframes 这个词。它其实是 hyperframe 这个库的名字,目标是帮你把 HTTP/2 的帧(frame)处理好——序列化、反序列化、按帧类型解析、管理标志位,全是帧层的事。如果你只写应…

2026/10/7 10:57:46 阅读更多 →
从ActionBar到Toolbar:Android顶部操作栏的接入与避坑

从ActionBar到Toolbar:Android顶部操作栏的接入与避坑

1. 为什么ActionBar逐渐被Toolbar取代:两个组件的定位与差异如果说你刚开始接触Android开发,多半会在各种教程里看到“ActionBar”和“Toolbar”这两个词混着出现。老实说,我刚入行的时候也蒙过一阵:明明Activity自带标题栏&#…

2026/10/7 10:57:46 阅读更多 →
无模型自适应控制MFAPC与MFAILC仿真验证与参数整定解析

无模型自适应控制MFAPC与MFAILC仿真验证与参数整定解析

这些年做工业过程控制,有件事我一直印象很深:现场工程师拿到一个控制任务,最愁的不是控制器本身,而是对象模型。机理建模费时费力,辨识实验又耽误生产,好不容易建出来的模型还经常随着工况漂移。所以当我接…

2026/10/7 10:57:46 阅读更多 →
Django视频点播系统实战:大文件上传、HLS转码与动态鉴权

Django视频点播系统实战:大文件上传、HLS转码与动态鉴权

简介:这是一套基于Python与Django框架实现的视频点播网站系统完整源码,专为本科毕业设计及Web全栈入门实践者打造,可直接运行部署,覆盖在线教育、短视频分享等典型业务场景。资源共128个文件,包含40个核心Python后端逻…

2026/10/7 10:57:46 阅读更多 →
Meta开放式机架V3:BBU与48V供电架构如何重塑高密度数据中心

Meta开放式机架V3:BBU与48V供电架构如何重塑高密度数据中心

1. 为什么大家都在看Meta的开放式机架V3搞数据中心硬件的人,这两年的关注点其实挺集中的:一个是怎么把单机柜功率密度提上去,另一个是怎么在供电和散热上不再被传统21英寸机架卡住脖子。Meta开放式机架V3(Open Rack V3&#xff0c…

2026/10/7 10:56:46 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 1:18:13 阅读更多 →