文章目录

  • 题目描述
  • 解题思路:三次最短路
  • Reference

题目描述

  • 2203. 得到要求路径的最小带权子图

解题思路:三次最短路

  • 从 src1\textit{src}_1src1​ 到 dest\textit{dest}dest 有唯一的一条简单路径,记为 XXX

  • 从 src2\textit{src}_2src2​ 到 dest\textit{dest}dest 有唯一的一条简单路径,记为 YYY

假设 XXX 上第一个与 YYY 共有的节点为 ccc,显然这样的 ccc 是一定存在的,因为 dest\textit{dest}dest 就是 XXX 和 YYY 的一个共有节点(但可能存在更早的共有节点)。因此,整个子图可以看成是三部分的并集:

  • 从 src1\textit{src}_1src1​ 到 ccc 的一条简单路径

  • 从 src2\textit{src}_2src2​ 到 ccc 的一条简单路径

  • 从 ccc 到 dest\textit{dest}dest 的一条简单路径

此时子图的边权和即为这三部分的边权和之和,即子图呈现「Y 型」。

算法流程:

  • 使用两次 Dijkstra\text{Dijkstra}Dijkstra 算法计算出以 src1\textit{src}_1src1​ 为出发点和以 src2\textit{src}_2src2​ 为出发点,到所有节点的最短路径长度
  • 对于「从 ccc 到 dest\textit{dest}dest」这一部分,可以将原图中的所有边反向,这样就变成了「从 dest\textit{dest}dest 到 ccc」。就可以使用 Dijkstra\text{Dijkstra}Dijkstra 算法计算出以 dest\textit{dest}dest 为出发点,到所有节点的最短路径长度
  • 在得到了所有需要的最短路径的长度之后,枚举 ccc 得出答案
class Solution {public long minimumWeight(int n, int[][] edges, int src1, int src2, int dest) {// 建图 正向图 + 反向图List<int[]>[] g = new List[n], rg = new List[n];Arrays.setAll(g, e -> new ArrayList<int[]>());Arrays.setAll(rg, e -> new ArrayList<int[]>());for (int[] e : edges) {int x = e[0], y = e[1], weight = e[2];g[x].add(new int[]{y, weight});rg[y].add(new int[]{x, weight});}// 3次dijkstralong[] dist1 = dijkstra(g, src1);long[] dist2 = dijkstra(g, src2);long[] dist3 = dijkstra(rg, dest);// 枚举 clong ans = Long.MAX_VALUE/3;for (int i = 0; i < n; i++) {if (dist1[i] == Long.MAX_VALUE/3 || dist2[i] == Long.MAX_VALUE/3 || dist3[i] == Long.MAX_VALUE/3) {continue ;}ans = Math.min(ans, dist1[i] + dist2[i] + dist3[i]);}return ans >= Long.MAX_VALUE/3 ? -1 : ans;}// 计算点 start 到各点的最短距离private long[] dijkstra(List<int[]>[] g, int start) {// dist[x] = y 代表从「源点/起点」到 x 的最短距离为 ylong[] dist = new long[g.length];// 起始先将所有的点标记为「距离为正无穷」Arrays.fill(dist, Long.MAX_VALUE / 3);// 只有起点最短距离为 0dist[start] = 0;// 小根堆 // 以 (到起点的距离,点编号) 进行存储,优先弹出「最短距离」较小的点PriorityQueue<long[]> pq = new PriorityQueue<long[]>((a, b) -> Long.compare(a[0], b[0]));pq.offer(new long[]{0l, start});while (!pq.isEmpty()) {long[] p = pq.poll();long weight = p[0];int x = (int) p[1];if (weight > dist[x]) {continue ;}// 更新其他点的「最短距离」for (int[] e : g[x]) {int y = e[0];long d = dist[x] + e[1];if (d < dist[y]) {dist[y] = d;pq.offer(new long[]{d, y});}}}return dist;}
}
  • 时间复杂度:O(n+mlog⁡m)O(n + m \log m)O(n+mlogm),其中 mmm 是数组 edges\textit{edges}edges 的长度

  • 空间复杂度:O(m)O(m)O(m),即为存储图和反向图的邻接表需要使用的空间

Reference

  • 得到要求路径的最小带权子图

LeetCode 2203. 得到要求路径的最小带权子图(dijkstra算法)相关推荐

  1. LeetCode实战:不同路径

    题目英文 A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below) ...

  2. leetcode 思路——64. 最小路径和——174. 地下城游戏

    leetcode 思路--64. 最小路径和--174. 地下城游戏 64. 最小路径和 174. 地下城游戏 64. 最小路径和 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角 ...

  3. 树的最小带权路径问题:POJ3253 修篱笆

    题目描述: Farmer John wants to repair a small length of the fence around the pasture. He measures the fe ...

  4. Leetcode 576. 出界的路径数

    Leetcode 576. 出界的路径数 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/out-of-boundary ...

  5. 拿来就能用!Dijkstra 算法实现快递路径优化

    作者 | 李秋键 责编 | 伍杏玲 出品 | AI科技大本营(ID:rgznai100) 近几年来,快递行业发展迅猛,其中的程序设计涉及到运送路径的最优选择问题,下面我们尝试模拟实现快递路径优化问题, ...

  6. 基于Dijkstra算法的武汉地铁路径规划!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:牧小熊,华中农业大学,Datawhale原创作者 前言 最近爬取了 ...

  7. 【路径规划】Dijkstra算法——超详细原理图解

    Dijkstra算法详解 1. Dijkstra算法原理  1.1. 有向图的Dijkstra算法  1.2. 无向图和栅格网络的拓展   1.2.1. 无向图   1.2.2. 栅格网络 2. Di ...

  8. 判断有向图g中顶点i到顶点j是否有路径_[源码和文档分享]基于Dijkstra算法的最短路径问题求解...

    摘 要 现实生活中许多数据的处理依赖于Dijkstra算法的应用,通过应用Dijkstra算法使复杂问题更加简单化.算法是以起始点为中心向外层层扩展,直到扩展到终点为止,最终求出最短路径.采用Visu ...

  9. 基于Dijkstra算法的武汉地铁路径规划!(附下载)

    来源:Datawhale 本文约3300字,建议阅读10分钟 本文为你详解路径规划项目,附源码链接. 前言 最近爬取了武汉地铁线路的信息,通过调用高德地图的api 获得各个站点的进度和纬度信息,使用D ...

最新文章

  1. WSGI 是什么?和nginx有什么关系?
  2. java实现类似于while(cin n)的操作
  3. Vue-admin工作整理(四):路由组件传参
  4. How-to-quick-getting-started-for-Frontend
  5. AutoLayout的那些事儿
  6. C语言高级输出及进阶
  7. (计算机组成原理)第四章指令系统-第一节2:扩展操作码
  8. linux c ecb 加密解密,OpenSSL对数组加密解密的完整实现代码
  9. vue-router中hash模式、history模式原理
  10. python中的常量_深入理解Python中的内置常量
  11. 《机器学习系统设计:Python语言实现》一2.1 Python与机器学习
  12. mysql 服务器配置信息和运行状态的查看(show variables like)
  13. Android 程序清单详解
  14. c语言编程 追赶法解方程组,追赶法解线性方程组.doc
  15. Linux时间同步(NTP)
  16. 如何在edge浏览器上安装flash插件运行需要flash的游戏
  17. 2G、3G无线路由器拨号连接过程
  18. C++STL算法equal(15)
  19. wireshark-filter帮助手册
  20. EasyExcel导出数据到Excel,浏览器提供下载

热门文章

  1. Spring Destroying singletons ... root of factory hierarchy 问题【已解决】
  2. 从今开始,两耳不闻窗外事,一心搞dp
  3. 【音视频基础】视频基础理论
  4. 智力答题源码php,php儿童智力测评系统
  5. 我是怎么做到开源系统中的文件上传等功能的?
  6. 区块链技术及实际应用
  7. [Azure]使用Powershell输出某台ASM虚拟机的NSG和ACL
  8. 无人机飞控 ardupilot Copter-4.0.7 库示例
  9. 微信小程序 数组 Json 导出到excel
  10. spring源码构建时缺失spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.4.jar