当前位置: 首页 > article >正文

LeetCode 3650. 边反转的最小路径总成本 —— 图论建模与 Dijkstra 最短路(最优思维解)

LeetCode 3650. 边反转的最小路径总成本 —— 图论建模与 Dijkstra 最短路最优思维解一、题目描述给你一个包含n个节点的有向带权图节点编号从0到n \- 1。同时给你一个数组edges其中edges\[i\] \[ui, vi, wi\]表示一条从节点ui到节点vi的有向边其成本为wi。每个节点ui都有一个最多可使用一次的开关当你到达ui且尚未使用其开关时你可以对其一条入边vi → ui激活开关将该边反转为ui → vi并立即穿过它。核心规则反转仅对当前单次移动有效非全局永久反转使用反转边的固定成本为2 \* wi每个节点的开关全局最多使用一次。请你返回从节点0到达节点n \- 1的最小总成本。如果无法到达返回\-1。题目示例示例 1输入n 4, edges [[0,1,3],[3,1,1],[2,3,4],[0,2,2]] 输出5 解释路径 0 → 1成本3在节点 1 使用开关反转边 3→1 为 1→3 并穿过成本2*12总成本 5。示例 2输入n 4, edges [[0,2,1],[2,1,1],[1,3,1],[2,3,3]] 输出3 解释不需要反转路径 0→2→1→3 总成本 3。题目约束2 \lt; n \lt; 5 \* 10^41 \lt; edges\.length \lt; 10^50 \lt; ui, vi \lt; n \- 11 \lt; wi \lt; 1000数据量级较大必须使用O((nm)log⁡n)O((nm)\log n)O((nm)logn)的堆优化 Dijkstra暴力解法、分层冗余解法会低效且没必要。二、误区纠正与核心思维突破2.1 常见错误解法避坑很多题解会使用分层图 Dijkstra拆分状态 0/1 记录是否使用开关该解法逻辑正确但代码冗余、常数更大属于过度建模。本题存在数学优化结论可以彻底舍弃状态分层将问题降维为标准单源最短路代码极简、效率最高。2.2 反转操作本质拆解题目开关操作本质对于任意一条原始边u → v, w该边是节点v的入边。当我们到达节点v时可以触发开关将这条入边临时反转为v → u并花费2\*w穿过。等价于原图每一条正向边都可以对应生成一条权重为 2*w 的反向虚拟边。2.3 关键定理本题解题核心定理正权有向图中本题的最优路径一定是简单路径无重复节点、无环。严谨证明本题所有边权w \gt; 0所有路径增量恒为正若一条路径存在环环的总权重一定大于 0删除环后路径总成本更小若原路径环上存在开关操作可将该操作提前至节点第一次访问时执行入边永久存在操作合法因此带环路径一定不是最优解最优解必然是无重复节点的简单路径。2.4 约束自动消除题目限制每个节点开关最多使用一次。最优路径是简单路径每个节点只会被访问一次。单次访问节点最多执行一次开关操作因此题目限制自动满足无需额外状态记录三、最终建模方案基于上述定理问题直接转化为标准单源最短路问题保留原图所有正向边u→v, w正常行走无需开关对每条原图边u→v, w新增一条虚拟反向边v→u, 2\*w代表在v节点使用开关反转入边在新图上跑 Dijkstra起点 0终点 n-1得到的最短路即为答案。四、算法执行步骤初始化长度为 n 的邻接表遍历所有原始边同时添加正向真实边、反向虚拟反转边初始化距离数组为无穷大起点距离置0小根堆实现 Dijkstra 松弛操作正权图可提前返回终点结果最终判断终点是否可达返回对应结果。五、完整代码实现最优AC版5.1 标准提交代码极简高效fromtypingimportListimportheapqclassSolution:defminCost(self,n:int,edges:List[List[int]])-int:# 构建扩充邻接表正向真实边 反向反转虚拟边adj[[]for_inrange(n)]foru,v,winedges:# 正常正向边无需开关adj[u].append((v,w))# 反转虚拟边在v节点使用开关反转入边代价2*wadj[v].append((u,2*w))# Dijkstra初始化INF10**18dist[INF]*n dist[0]0heap[(0,0)]whileheap:cur_cost,cur_nodeheapq.heappop(heap)# 过期松弛状态直接跳过ifcur_costdist[cur_node]:continue# 正权图首次弹出终点即为最短路提前返回优化效率ifcur_noden-1:returncur_cost# 遍历所有邻边松弛fornxt_node,weightinadj[cur_node]:new_costcur_costweightifnew_costdist[nxt_node]:dist[nxt_node]new_cost heapq.heappush(heap,(new_cost,nxt_node))# 终点不可达return-15.2 超详细注释版新手学习fromtypingimportListimportheapqclassSolution:defminCost(self,n:int,edges:List[List[int]])-int:# 初始化邻接表存储扩充后的完整图graph[[]for_inrange(n)]# 遍历所有原始边完成图的扩充foru,v,winedges:# 1. 添加原始正向有向边正常行走无需开关graph[u].append((v,w))# 2. 添加反转虚拟边在v节点触发开关反转u-v入边# 反转行走代价固定为 2 * wgraph[v].append((u,2*w))# 初始化最短路距离取极大值避免溢出INF10**18min_dist[INF]*n min_dist[0]0# 起点0距离为0# 最小堆(当前累计花费, 当前节点)priority_queue[(0,0)]whilepriority_queue:current_cost,nodeheapq.heappop(priority_queue)# 剪枝当前记录的距离已经更优跳过无效状态ifcurrent_costmin_dist[node]:continue# Dijkstra正权特性首次弹出终点即为最优解提前返回ifnoden-1:returncurrent_cost# 松弛所有邻接边forneighbor,weightingraph[node]:total_costcurrent_costweight# 更新更优路径iftotal_costmin_dist[neighbor]:min_dist[neighbor]total_cost heapq.heappush(priority_queue,(total_cost,neighbor))# 遍历完成仍未到达终点返回-1return-15.3 全套测试代码多用例验证fromtypingimportListimportheapqclassSolution:defminCost(self,n:int,edges:List[List[int]])-int:adj[[]for_inrange(n)]foru,v,winedges:adj[u].append((v,w))adj[v].append((u,2*w))INF10**18dist[INF]*n dist[0]0heap[(0,0)]whileheap:d,uheapq.heappop(heap)ifddist[u]:continueifun-1:returndforv,winadj[u]:ifdwdist[v]:dist[v]dw heapq.heappush(heap,(dist[v],v))return-1# 测试用例验证if__name____main__:solSolution()# 示例1print(示例1输出,sol.minCost(4,[[0,1,3],[3,1,1],[2,3,4],[0,2,2]]))# 5# 示例2print(示例2输出,sol.minCost(4,[[0,2,1],[2,1,1],[1,3,1],[2,3,3]]))# 3# 无路径测试print(无路径用例输出,sol.minCost(3,[[0,1,1]]))# -1六、样例原理深度复盘示例1复盘原始边包含3→1, w1我们会自动生成反向虚拟边1→3, w2。最优路径0→1\(3\) \ 1→3\(2\)总成本 5完全匹配题目最优解。示例2复盘原图正向路径0→2→1→3总成本 3优于所有带反转的路径算法直接选取正向最短路。七、复杂度分析时间复杂度O((nm)log⁡n)O((nm)\log n)O((nm)logn)建图O(m)O(m)O(m)每条边生成两条边总边数2m2m2mDijkstra 堆优化每条边松弛一次堆操作复杂度O(log⁡n)O(\log n)O(logn)适配题目10^5级超大数组效率拉满。空间复杂度O(nm)O(nm)O(nm)邻接表存储扩充后的所有边距离数组、堆为线性空间开销。八、面试高频总结与核心考点1. 解题核心精髓本题最大的考点不是图论模板而是思维建模通过正权图无环最优解定理消除题目看似复杂的“节点单次开关限制”将带约束难题转化为裸最短路问题。2. 思维对比笨方法分层图、状态拆分、双重循环、冗余计算巧方法数学证明消约束、扩充边建模、标准Dijkstra秒杀。3. 通用模板迁移所有正权图、单点单次特殊操作的最短路问题均可优先思考最优解是否为简单路径、约束是否可自动消除避免无脑分层。九、易错点汇总❌ 错误反转边权重为w正确应为2\*w❌ 错误为u添加反向边正确应为给原边终点v添加反向边❌ 错误必须分层记录状态正确正权图自动满足单次约束✅ 正确核心反转操作 预先添加高代价反向虚拟边。

相关文章:

LeetCode 3650. 边反转的最小路径总成本 —— 图论建模与 Dijkstra 最短路(最优思维解)

LeetCode 3650. 边反转的最小路径总成本 —— 图论建模与 Dijkstra 最短路(最优思维解) 一、题目描述 给你一个包含 n 个节点的有向带权图,节点编号从 0 到 n \- 1。同时给你一个数组 edges ,其中 edges\[i\] \[ui, vi, wi\] 表示…...

别再手动改报价了!用SHDB录屏+ABAP批量更新ME47项目信息,效率翻倍

告别低效操作:SHDBABAP批量更新ME47项目信息的实战指南 在SAP MM模块的日常运维中,报价请求项目信息的更新是采购流程中频繁出现却又极其耗时的操作。想象一下这样的场景:每月需要处理上千条报价请求项目,每个项目都需要手动进入M…...

NCMconverter终极指南:3步解锁加密音频文件,实现真正的音频自由

NCMconverter终极指南:3步解锁加密音频文件,实现真正的音频自由 【免费下载链接】NCMconverter NCMconverter将ncm文件转换为mp3或者flac文件 项目地址: https://gitcode.com/gh_mirrors/nc/NCMconverter 你是否曾为那些无法在普通播放器中播放的…...

别再死记硬背公式了!用Python模拟激光增益、损耗与自激振荡全过程

用Python动态模拟激光器中的增益、损耗与自激振荡 激光技术是现代科技的重要支柱,从医疗美容到工业切割,从光纤通信到量子计算,激光无处不在。然而,对于许多学习激光原理的学生和工程师来说,理解激光器内部的光子动力学…...

NSC_BUILDER终极指南:Nintendo Switch文件处理的完整解决方案

NSC_BUILDER终极指南:Nintendo Switch文件处理的完整解决方案 【免费下载链接】NSC_BUILDER Nintendo Switch Cleaner and Builder. A batchfile, python and html script based in hacbuild and Nuts python libraries. Designed initially to erase titlerights e…...

PotatoNV终极指南:免费解锁华为设备Bootloader的完整教程

PotatoNV终极指南:免费解锁华为设备Bootloader的完整教程 【免费下载链接】PotatoNV Unlock bootloader of Huawei devices on Kirin 960/95x/65x/620 项目地址: https://gitcode.com/gh_mirrors/po/PotatoNV 还在为华为设备的系统限制而烦恼吗?想…...

不止是算方差:用MATLAB var函数搭配权重向量w做加权统计分析

不止是算方差:用MATLAB var函数搭配权重向量w做加权统计分析 在数据分析领域,方差计算是最基础也最重要的统计量之一。但当我们面对真实世界的数据时,简单的等权重方差计算往往无法满足需求——金融时间序列中近期数据可能比历史数据更重要&a…...

第18章:OpenClaw的实战案例解析

Openclaw从入门到精通系列文章 文章目录 Openclaw从入门到精通系列文章 前言 一、案例一:美妆类一人公司——全流程内容自动化运营 1.1 场景痛点 1.2 需求拆解 1.3 实操配置步骤 1.4 案例效果复盘 二、案例二:知识付费类一人公司——社群自动化运营 2.1 场景痛点 2.2 需求拆解…...

【Laravel 12+ AI集成避坑红宝书】:20年PHP架构师亲授7大高危陷阱与实时防御方案

更多请点击: https://intelliparadigm.com 第一章:Laravel 12 AI集成避坑指南全景认知 Laravel 12 引入了更严格的依赖注入契约、默认启用的严格类型检查,以及对异步 HTTP 客户端(如 GuzzleHttp\Promise)的深度整合要…...

避坑!SEED-XDS560V2PLUS仿真器安全模式退出失败?你可能缺了这几个关键DLL文件

SEED-XDS560V2PLUS仿真器安全模式疑难解析:从DLL缺失到精准修复 当三个EMU指示灯开始同步闪烁时,熟悉SEED-XDS560V2PLUS的工程师会立即意识到设备进入了安全模式。虽然官方文档提供了标准恢复流程,但在实际执行dtc_conf set seed560v2u 0 saf…...

突破性方案:如何为老旧Mac解锁最新macOS系统支持

突破性方案:如何为老旧Mac解锁最新macOS系统支持 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher 作为一项突破性技术方案…...

macOS系统安全加固实战:从PF防火墙到osquery监控的完整方案

1. 项目概述:一个为macOS打造的“硬核”安全工具如果你是一名长期在macOS上进行开发、运维或者对系统安全有较高要求的用户,那么你很可能和我一样,对macOS内置的安全机制既爱又恨。爱的是它的沙盒、Gatekeeper和SIP(系统完整性保护…...

Figma中文插件深度解析:5分钟实现专业级设计界面本地化

Figma中文插件深度解析:5分钟实现专业级设计界面本地化 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN Figma中文插件是一款经过设计师人工翻译校验的专业工具,能…...

对比使用前后,Taotoken 计费透明性带来的预算管理变化

对比使用前后,Taotoken 计费透明性带来的预算管理变化 1. 传统大模型 API 成本管理的痛点 在引入 Taotoken 平台之前,许多项目团队面临大模型 API 成本管理的共同挑战。调用不同厂商的模型时,账单分散在各平台控制台,缺乏统一视…...

别让你的.NET应用在Linux上崩溃:手把手教你处理PlatformNotSupportedException

别让你的.NET应用在Linux上崩溃:手把手教你处理PlatformNotSupportedException 当你的.NET应用从Windows迁移到Linux时,最令人头疼的莫过于那些突如其来的PlatformNotSupportedException。想象一下,一个在Windows上运行完美的应用&#xff0c…...

别再只懂开机和关机了!用systemctl isolate命令,5分钟玩转Linux的multi-user.target和graphical.target

别再只懂开机和关机了!用systemctl isolate命令,5分钟玩转Linux的multi-user.target和graphical.target 想象一下你的Linux系统就像一部智能手机——有时你需要专注工作(开启勿扰模式),有时想玩游戏(性能模…...

OpenClaw注释用法:龙虾智能体代码注释规范(提高可读性)

OpenClaw注释用法:龙虾智能体代码注释规范(提高可读性)📚 本章学习目标:深入理解OpenClaw注释用法的核心概念与实践方法,掌握关键技术要点,了解实际应用场景与最佳实践。本文属于《一只龙虾的智…...

用PyTorch复现一个“工业级”时间序列预测流程:从数据预处理、移动平均、ARIMA调参到LSTM融合的完整实战

工业级时间序列预测实战:从数据清洗到模型融合的PyTorch全流程解析 当业务部门向你递来一份历史销售数据,要求预测未来三个月的业绩走势时,作为数据科学家的你该如何构建一个可靠的预测系统?这不仅仅是选择某个算法那么简单&#…...

EEG微状态分析是“玄学”吗?用傅里叶替代数据和VAR模型验证其线性本质

EEG微状态分析的线性本质:从傅里叶替代数据到VAR模型的实证检验 在神经科学领域,EEG微状态分析一直被视为探索大脑动态活动的有力工具。这种将多通道脑电信号分解为离散"思维单元"的方法,为理解认知过程和临床异常提供了独特视角。…...

REFramework深度解析:RE引擎游戏逆向工程与模块化架构设计实现原理

REFramework深度解析:RE引擎游戏逆向工程与模块化架构设计实现原理 【免费下载链接】REFramework Mod loader, scripting platform, and VR support for all RE Engine games 项目地址: https://gitcode.com/GitHub_Trending/re/REFramework REFramework是一…...

Python 爬虫高级实战:HTTP/2 协议爬虫请求优化

前言 在传统爬虫开发体系中,绝大多数网络请求均基于 HTTP/1.1 协议完成数据交互,该协议诞生已久,技术架构成熟且适配性极强,但在高并发请求、多资源并行加载、网络传输效率层面存在天然短板。随着互联网服务架构持续升级,各大主流平台、大型电商、资讯门户、接口服务端已…...

八大网盘高速下载神器:LinkSwift直链解析工具完全指南

八大网盘高速下载神器:LinkSwift直链解析工具完全指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...

mkcert进阶玩法:给你的局域网测试环境(如192.168.x.x)也装上‘绿锁’证书

mkcert局域网HTTPS实战:为192.168.x.x与内网域名部署可信证书 当你在会议室演示项目时,手机扫码访问同事电脑上的测试服务却看到红色警告;当IoT设备尝试连接本地开发机的API时因证书错误中断通信——这些场景暴露了局域网HTTPS部署的痛点。传…...

基于OpenClaw技能框架的自动化工具箱设计与实践

1. 项目概述:一个围绕OpenClaw的自动化工具箱 如果你和我一样,日常工作中经常需要处理一些重复、琐碎但又不得不做的任务,比如手动整理银行账单、汇总数据报表,或者在不同应用间同步信息,那你肯定想过要搞点自动化。但…...

100个Proteus仿真项目持续更新(免费获取+视频讲解)

视频讲解代码获取:【金山文档 | WPS云文档】 51单片机设计项目汇总下面这个是个excel 将其复制到浏览器就可以看到了 https://www.kdocs.cn/l/ccAzhlj7snIv## 你离“单片机高手”只差这100个Proteus仿真项目! ### —— 不用买硬件,不用搭电…...

OpenCore Legacy Patcher:3步免费升级旧Mac,体验最新macOS的终极指南

OpenCore Legacy Patcher:3步免费升级旧Mac,体验最新macOS的终极指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy…...

告别死记硬背:用一张流程图彻底搞懂SAP MRP运行参数(MD01/MD02/MD01N)

SAP MRP参数决策指南:从零构建智能物料计划思维框架 当你在SAP系统中首次打开MRP运行界面时,面对MD01/MD02/MD01N中密密麻麻的参数选项,是否感到无从下手?这就像面对一个没有地图的迷宫——每个参数看似独立却又相互关联&#xff…...

告别插件依赖!纯手工打造VSCode同款Vim主题与状态栏(附完整.vimrc配置)

极简主义者的Vim美学:手工打造VSCode风格开发环境 在编辑器选择日益丰富的今天,Vim依然以其独特的魅力吸引着大批开发者。但当我们习惯了现代编辑器如VSCode的视觉体验后,如何在保持Vim高效操作的同时,获得更舒适的界面呈现&#…...

ESP32串口通信保姆级教程:从Serial.begin()到多设备数据交换(附避坑指南)

ESP32串口通信保姆级教程:从Serial.begin()到多设备数据交换(附避坑指南) 当你第一次拿到ESP32开发板时,可能会被它丰富的通信接口所吸引。其中,UART串口通信是最基础也最实用的功能之一。无论是调试输出、设备间数据交…...

N_m3u8DL-CLI-SimpleG:3分钟掌握M3U8视频下载的终极指南

N_m3u8DL-CLI-SimpleG:3分钟掌握M3U8视频下载的终极指南 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 你是否曾遇到过想保存在线视频却束手无策的困扰?面…...