UVa 11336 DRM
题目描述DRM Inc.\texttt{DRM Inc.}DRM Inc.是一家生产数字道路地图的公司。一张数字地图由一组地点和一组连接地点的街道组成。街道是无向的即双向街道。地点aaa到地点bbb的道路是一个地点序列⟨u0,u1,…,un⟩\langle u_0, u_1, \ldots, u_n \rangle⟨u0​,u1​,…,un​⟩满足au0a u_0au0​bunb u_nbun​并且对于0≤in0 \leq i n0≤inuiu_iui​和ui1u_{i1}ui1​之间有一条街道。地图的定义是逐步完成的新版本的地图是在已有地图的基础上添加细节构建而成。新地图必须与旧地图一致即新地图必须比旧地图更详细具体要求如下新地图至少包含旧地图中的所有地点对于旧地图中连接地点uuu和vvv的每条街道在新地图中必须存在一条连接uuu和vvv的道路。这条道路的中间地点必须是新地点即不在旧地图中的地点。DRM\texttt{DRM}DRM的构建过程包括比较相邻版本的地图以确保它们之间的一致性。你需要帮助DRM\texttt{DRM}DRM判断一张地图是否比另一张地图更详细。输入格式每张地图由若干行表示第一行包含地图的标识符。接下来的若干行最后一行除外每行包含两个地点的标识符表示它们之间有一条街道。标识符之间用空格分隔。保证每条街道只被描述一次但地点的顺序可能任意。此外街道没有特定的顺序。最后一行是字符串* * *星号、空格、星号、空格、星号。输入描述多个测试用例每个用例由一对这样的地图表示。你需要判断每对中的第二张地图是否是第一张地图的更详细版本。输入的结束由一行END\texttt{END}END表示。输出格式对于每个输入用例按输入顺序输出。对于每对地图id1和id2如果id2比id1更详细输出YES: id2 is a more detailed version of id1否则输出NO: id2 is not a more detailed version of id1样例输入COL1 Bogota Cali Bogota Barranquilla * * * COL2 Barranquilla Bogota Armenia Cali Barranquilla Armenia Bogota Cali Cali Barrranquilla * * * COL1 Bogota Cali Bogota Barranquilla * * * COL3 Bogota Armenia Armenia Cali Cali Medellin Medellin Barranquilla * * * END输出YES: COL2 is a more detailed version of COL1 NO: COL3 is not a more detailed version of COL1题目分析本题的核心是判断两张地图之间的“更详细”关系。这本质上是一个图论包含关系的判定问题。将地图建模为无向图每个地点是一个节点每条街道是一条无向边。那么“更详细”的定义转化为节点集包含新图的节点集合必须包含旧图的所有节点。路径存在且中间节点为新对于旧图的每条边(u,v)(u, v)(u,v)在新图中必须存在一条从uuu到vvv的道路且该道路除端点外所有中间节点都不能出现在旧图中即必须是新节点。第二个条件比单纯的“旧图的边在新图中存在路径”更强它要求这条路径不能经过任何旧节点作为中间节点。这意味着如果新图中有从uuu到vvv的路径但该路径经过了某个旧节点www那么这条路径是不合法的因为www不是新地点。一个关键的观察是旧图中的边(u,v)(u, v)(u,v)本身可能在新图中直接存在即(u,v)(u, v)(u,v)本身就是一条街道。此时路径长度为111没有中间节点自动满足条件。如果新图中不存在直接边则需要通过一些新节点即不在旧图中的节点作为桥梁连接uuu和vvv。解题思路数据结构选择由于地点标识符是字符串我们需要使用哈希结构来高效存储和查询。采用unordered_set\texttt{unordered\_set}unordered_set存储地点集合采用set\texttt{set}set存储街道集合并将端点按字典序排序以统一表示无向边。条件 1 的判断遍历旧地图的所有地点检查每个地点是否出现在新地图的地点集合中。一旦有一个缺失即可判定为不满足。条件 2 的判断对于旧地图的每条边(u,v)(u, v)(u,v)我们需要在新地图中进行一次受限的连通性查询允许访问的节点包括所有新地图中的节点。但中间节点即路径上除起点uuu和终点vvv之外的节点不能是旧地图中的节点。换句话说我们在新地图的图上删除所有旧地图中的节点保留uuu和vvv作为访问允许的例外然后检查uuu和vvv是否连通。注意起点uuu和终点vvv本身可以是旧节点因为它们就是旧地图中边的端点但它们作为路径的端点不受到中间节点限制的约束。实现方法对于每条边(u,v)(u, v)(u,v)如果在新地图中存在直接边(u,v)(u, v)(u,v)则直接通过路径长度为111无中间节点。否则执行广度优先搜索BFS\texttt{BFS}BFS从uuu出发只允许访问新地图中存在的节点除了vvv之外不能访问旧地图中的节点。如果在搜索过程中遇到vvv则说明存在合法路径。注意BFS\texttt{BFS}BFS的访问限制需要动态判断当前节点为curcurcur下一个节点为nxtnxtnxt。如果nxtnxtnxt等于vvv则允许访问因为它是终点否则如果nxtnxtnxt是旧节点则禁止访问。时间复杂度分析设V1V_1V1​为旧地图节点数E1E_1E1​为旧地图边数V2V_2V2​为新地图节点数E2E_2E2​为新地图边数构建哈希表O(V2E2)O(V_2 E_2)O(V2​E2​)。条件 1 检查O(V1)O(V_1)O(V1​)。条件 2 检查对每条旧边进行BFS\texttt{BFS}BFS每次BFS\texttt{BFS}BFS的复杂度为O(V2E2)O(V_2 E_2)O(V2​E2​)。总复杂度O(E1⋅(V2E2))O(E_1 \cdot (V_2 E_2))O(E1​⋅(V2​E2​))。在最坏情况下E1E_1E1​和E2E_2E2​都可能很大节点数为nnn时边数可达O(n2)O(n^2)O(n2)量级。但由于本题实际数据规模较小该算法足以通过。正确性说明条件 1 保证了新地图不会丢失旧地图中的任何地点。条件 2 保证了旧地图中的每条直接连接在更详细的地图中可以被一条“只通过新地点”的路径替代这正符合题目中“中间地点必须是新地点”的要求。因此同时满足两个条件即为更详细版本。代码实现// DRM// UVa ID: 11336// Verdict: Accepted// Submission Date: 2026-06-13// UVa Run Time: 0.000s//// 版权所有C2026邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;// 读取地图返回 (id, 地点集合, 街道集合)tuplestring,unordered_setstring,setpairstring,stringreadMap(){string id;cinid;unordered_setstringplaces;setpairstring,stringstreets;string a,b;while(cina){if(a*){cinb;// 第二个 *cinb;// 第三个 *break;}cinb;places.insert(a);places.insert(b);if(ab)swap(a,b);streets.insert({a,b});}return{id,places,streets};}intmain(){while(true){auto[id1,oldPlaces,oldStreets]readMap();if(id1END)break;auto[id2,newPlaces,newStreets]readMap();// 条件1新地点必须包含所有旧地点booloktrue;for(conststringp:oldPlaces)if(newPlaces.find(p)newPlaces.end()){okfalse;break;}if(!ok){coutNO: id2 is not a more detailed version of id1\n;continue;}// 构建新地图的邻接表unordered_mapstring,vectorstringnewAdj;for(autoe:newStreets){newAdj[e.first].push_back(e.second);newAdj[e.second].push_back(e.first);}// 条件2检查旧地图的每条街道for(autoe:oldStreets){string ue.first,ve.second;// BFS 从 u 到 v只允许经过新地点但 u 和 v 本身允许是旧地点unordered_setstringvisited;queuestringq;q.push(u);visited.insert(u);boolreachablefalse;while(!q.empty()){string curq.front();q.pop();if(curv){reachabletrue;break;}for(string nxt:newAdj[cur]){if(visited.count(nxt))continue;// 中间节点必须是新地点不在 oldPlaces 中或者就是终点 vif(nxt!voldPlaces.count(nxt))continue;visited.insert(nxt);q.push(nxt);}}if(!reachable){okfalse;break;}}if(ok)coutYES: id2 is a more detailed version of id1\n;elsecoutNO: id2 is not a more detailed version of id1\n;}return0;}总结本题是一道典型的图论包含关系判定问题核心在于正确理解“更详细”的两个条件并分别进行验证节点包含简单的哈希集合包含判断。受限路径存在需要在新图的子图上进行BFS\texttt{BFS}BFS且该子图只包含“新节点”加上边的端点作为例外。关键技巧使用unordered_set\texttt{unordered\_set}unordered_set和set\texttt{set}set高效存储和查询节点与边。在BFS\texttt{BFS}BFS中动态决定哪些节点可以访问而不是预先构建子图。注意边界情况直接边存在时无需BFS\texttt{BFS}BFS路径长度为111自动满足条件。易错点混淆旧节点和新节点的角色路径的中间节点必须严格是新节点但端点可以属于旧节点。忘记处理uuu或vvv可能在新图中孤立的情况即没有邻接边。输入格式中街道顺序可能乱序需要统一规范存储如字典序。本题适合用来训练图论建模能力和对复杂条件的实现能力。

相关新闻

终极指南:如何用Plain Craft Launcher 2轻松管理你的Minecraft游戏体验

终极指南:如何用Plain Craft Launcher 2轻松管理你的Minecraft游戏体验

终极指南:如何用Plain Craft Launcher 2轻松管理你的Minecraft游戏体验 【免费下载链接】PCL Minecraft 启动器 Plain Craft Launcher(PCL)。 项目地址: https://gitcode.com/gh_mirrors/pc/PCL Plain Craft Launcher 2(PC…

2026/8/10 12:45:37 阅读更多 →
VMware Tools 手动安装全攻略:解决灰色按钮问题,提升虚拟机性能

VMware Tools 手动安装全攻略:解决灰色按钮问题,提升虚拟机性能

在虚拟机环境中,VMware Tools 是提升用户体验和系统性能的关键组件,它负责实现主机与虚拟机之间的无缝集成,如文件拖拽、剪贴板共享、屏幕自适应分辨率以及时间同步等功能。然而,许多用户在安装或升级虚拟机系统后,经常…

2026/8/10 12:45:37 阅读更多 →
Claude Code自动化执行方案与权限配置详解

Claude Code自动化执行方案与权限配置详解

1. Claude Code自动化执行方案解析作为一款新兴的代码辅助工具,Claude Code在实际使用中经常需要反复确认操作权限,这种交互方式虽然安全但严重影响工作效率。经过两周的深度测试,我总结出一套完整的自动化配置方案,能够彻底解决确…

2026/8/10 12:44:36 阅读更多 →

最新新闻

如何快速掌握Apache DolphinScheduler:面向开发者的完整数据编排与任务调度指南

如何快速掌握Apache DolphinScheduler:面向开发者的完整数据编排与任务调度指南

如何快速掌握Apache DolphinScheduler:面向开发者的完整数据编排与任务调度指南 【免费下载链接】dolphinscheduler Apache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code 项目地址: ht…

2026/8/10 15:44:43 阅读更多 →
鸣潮自动化工具ok-ww深度报告:当AI成为你的游戏副驾驶

鸣潮自动化工具ok-ww深度报告:当AI成为你的游戏副驾驶

鸣潮自动化工具ok-ww深度报告:当AI成为你的游戏副驾驶 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 你是否也曾计算过…

2026/8/10 15:44:43 阅读更多 →
探索AI自瞄黑科技:3步打造你的FPS游戏智能瞄准助手

探索AI自瞄黑科技:3步打造你的FPS游戏智能瞄准助手

探索AI自瞄黑科技:3步打造你的FPS游戏智能瞄准助手 【免费下载链接】yolov8_aimbot Aim-bot based on AI for all FPS games 项目地址: https://gitcode.com/gh_mirrors/yo/yolov8_aimbot 想在激烈的FPS游戏中实现"神枪手"般的精准瞄准吗&#xff…

2026/8/10 15:44:43 阅读更多 →
MATLAB常见错误诊断与性能优化实战指南

MATLAB常见错误诊断与性能优化实战指南

1. MATLAB常见错误诊断与优化技巧概述MATLAB作为工程计算领域的标杆工具,其强大的矩阵运算能力和丰富的工具箱使其在学术界和工业界都广受欢迎。但就像任何强大的工具一样,使用过程中难免会遇到各种报错和性能瓶颈。根据我多年使用MATLAB的经验&#xff…

2026/8/10 15:43:43 阅读更多 →
从零开始:3步部署你的企业级AI数据协作平台Teable

从零开始:3步部署你的企业级AI数据协作平台Teable

从零开始:3步部署你的企业级AI数据协作平台Teable 【免费下载链接】teable ✨ AI Spreadsheet for Business 项目地址: https://gitcode.com/GitHub_Trending/te/teable 想象一下,如果你的团队能在一个平台上同时管理客户数据、跟踪项目进度、创建…

2026/8/10 15:43:43 阅读更多 →
Kimi K2.7 Code接入MaaS平台:API集成、成本优化与实战指南

Kimi K2.7 Code接入MaaS平台:API集成、成本优化与实战指南

1. 项目概述:Kimi K2.7 Code登陆MIAOYUN MaaS平台意味着什么? 最近在AI开发圈里,一个消息引起了不小的讨论:月之暗面(Moonshot AI)的Kimi K2.7 Code模型,正式上架到了MIAOYUN的MaaS(…

2026/8/10 15:43:43 阅读更多 →

日新闻

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南 【免费下载链接】graphql-css A blazing fast CSS-in-GQL™ library. 项目地址: https://gitcode.com/gh_mirrors/gr/graphql-css GraphQL-CSS是一个基于GraphQL的CSS-in-GQL™库&#xff0…

2026/8/10 0:00:02 阅读更多 →
告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南 【免费下载链接】kiss-translator A simple, open source bilingual translation extension & Greasemonkey script (一个简约、开源的 双语对照翻译扩展 & 油猴脚本) 项目地址: https://gitcode.com/…

2026/8/10 0:00:02 阅读更多 →
BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案 【免费下载链接】BepInEx.ConfigurationManager Plugin configuration manager for BepInEx 项目地址: https://gitcode.com/gh_mirrors/be/BepInEx.ConfigurationManager 你是否曾经因为游戏插件的复杂…

2026/8/10 0:00:02 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/10 1:05:29 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/10 1:05:29 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/10 1:05:29 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/9 17:05:02 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/10 1:05:29 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/9 17:05:02 阅读更多 →