LeetCode:2642. 设计可以求最短路径的图类(SPFA Java)

news/2024/4/27 18:21:13

目录

2642. 设计可以求最短路径的图类

题目描述:

实现代码与解析:

SPFA

原理思路:


2642. 设计可以求最短路径的图类

题目描述:

        给你一个有 n 个节点的 有向带权 图,节点编号为 0 到 n - 1 。图中的初始边用数组 edges 表示,其中 edges[i] = [fromi, toi, edgeCosti] 表示从 fromi 到 toi 有一条代价为 edgeCosti 的边。

请你实现一个 Graph 类:

  • Graph(int n, int[][] edges) 初始化图有 n 个节点,并输入初始边。
  • addEdge(int[] edge) 向边集中添加一条边,其中 edge = [from, to, edgeCost] 。数据保证添加这条边之前对应的两个节点之间没有有向边。
  • int shortestPath(int node1, int node2) 返回从节点 node1 到 node2 的路径 最小 代价。如果路径不存在,返回 -1 。一条路径的代价是路径中所有边代价之和。

示例 1:

输入:
["Graph", "shortestPath", "shortestPath", "addEdge", "shortestPath"]
[[4, [[0, 2, 5], [0, 1, 2], [1, 2, 1], [3, 0, 3]]], [3, 2], [0, 3], [[1, 3, 4]], [0, 3]]
输出:
[null, 6, -1, null, 6]解释:
Graph g = new Graph(4, [[0, 2, 5], [0, 1, 2], [1, 2, 1], [3, 0, 3]]);
g.shortestPath(3, 2); // 返回 6 。从 3 到 2 的最短路径如第一幅图所示:3 -> 0 -> 1 -> 2 ,总代价为 3 + 2 + 1 = 6 。
g.shortestPath(0, 3); // 返回 -1 。没有从 0 到 3 的路径。
g.addEdge([1, 3, 4]); // 添加一条节点 1 到节点 3 的边,得到第二幅图。
g.shortestPath(0, 3); // 返回 6 。从 0 到 3 的最短路径为 0 -> 1 -> 3 ,总代价为 2 + 4 = 6 。

提示:

  • 1 <= n <= 100
  • 0 <= edges.length <= n * (n - 1)
  • edges[i].length == edge.length == 3
  • 0 <= fromi, toi, from, to, node1, node2 <= n - 1
  • 1 <= edgeCosti, edgeCost <= 106
  • 图中任何时候都不会有重边和自环。
  • 调用 addEdge 至多 100 次。
  • 调用 shortestPath 至多 100 次。

实现代码与解析:

SPFA

class Graph {final int N = 210;int[] h = new int[N], e = new int[N * N], ne = new int[N * N], w = new int[N * N];int[] dist = new int[N];int idx;boolean[] st = new boolean[N];public void add(int a, int b, int c) {w[idx] = c; e[idx] = b; ne[idx] = h[a]; h[a] = idx++;}public Graph(int n, int[][] edges) {Arrays.fill(h, -1);for (int[] e: edges) {int a = e[0];int b = e[1];int c = e[2];add(a, b, c);}}public void addEdge(int[] edge) {add(edge[0], edge[1], edge[2]);}public int shortestPath(int node1, int node2) {if (node1 == node2) return 0; // 处理起点就是终点的情况Arrays.fill(dist, 0x3f3f3f3f); // 每次都要初始化Arrays.fill(st, false);// 每次都要初始化Queue<Integer> q = new LinkedList<>();q.offer(node1);st[node1] = true;dist[node1] = 0;while (!q.isEmpty()) {int t = q.peek();q.poll();st[t] = false;for (int i = h[t]; i != -1; i = ne[i]) {int j = e[i];if (dist[t] + w[i] <= dist[j]) {dist[j] = dist[t] + w[i];if (!st[j]) {st[j] = true;q.offer(j);}}}}return dist[node2] ==  0x3f3f3f3f ? -1 : dist[node2];}
}

原理思路:

        最短路算法,直接用就行。数据量比较小,也可以直接floyd也行。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【Word自动化办公】使用python-docx对Word进行操作

目录 一、环境安装 二、文档各组成结构获取 2.1 组成结构讲解 2.2 段落run对象的切分标准 三、获取整篇文档内容 四、写入指定样式的数据 4.1 通过add_paragraph与add_run参数添加样式 4.2 单独设置文本样式 五、添加标题 六、换行符&换页符 七、添加图片数据 …

物联网数据报表分析

随着物联网技术的迅猛发展&#xff0c;越来越多的企业开始将物联网解决方案应用于各个领域&#xff0c;从提高生产效率到优化用户体验&#xff0c;物联网都发挥着至关重要的作用。然而&#xff0c;如何有效地分析和管理物联网产生的海量数据&#xff0c;成为企业面临的挑战之一…

Gavin Wood 精彩演讲|安全灵活 JAM 链,打造去中心化多核计算机

Polkadot 年度开发者大会 sub0 Asia 近期在泰国曼谷正式落幕。面对区块链行业的激烈竞争&#xff0c;Polkadot 创始人 Gavin Wood 在演讲中说明将如何利用 Polkadot 2.0 与 JAM 链带来新的技术创新&#xff0c;推动生态持续发展。 Polkadot 将推一个名为 JAM 链的新网络。JAM …

智慧园区楼宇AI解决方案

背景 人工智能对于人类的影响要比工业革命发生的速度快10倍,规模大 300倍,影响几乎大3000倍 - 麦肯锡全球研究院;2017年7月20日,国务院印发《新一代人工智能发展规划》,首次把人工智能发展上升为国家战略层面,全面布局面向2030年的中国人工智能发展整体规划;中美同时进…

全球首位AI程序员诞生,将会对程序员的影响有多大?

全球首位AI程序员诞生&#xff0c;将会对程序员的影响有多大&#xff1f; 近期&#xff0c;全球首位AI程序员Devin的出场&#xff0c;不禁让我想到了一个有趣的问题&#xff1a;AI程序员会不会抢程序员的饭碗呢&#xff1f;先别着急下结论&#xff01;虽然AI技术在编程领域越来…

数据结构——顺序表

大家好&#xff0c;我是小锋&#xff0c;今天我们进入顺序表的学习 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符…