力扣 743. 网络延迟时间

题目来源:https://leetcode-cn.com/problems/network-delay-time/

大致题意:
给出一个(起点,目的点,边长)的集合,然后给出一个源点,求出到其他所有点的单源最短路径。
若源点能到达所有目的点,则返回最长的最短路径,否则返回-1。

思路

单源最短路径,就选 dijkstra

dijkstra

可求出源点到其他点的最短路径。
首先需要有两个数组,一个distance存已知的最短路径(初始时源点位置为0,其他点为无穷大),一个found存已确定的最短路径目的点。
接着:

  1. 遍历所有点
  2. 对于当前遍历的节点,在未确定最短路径的点集中求出目前的最短路径点
  3. 上一步所求点,可以确定当前它的最短路径即为当前distance的内容
  4. 更新所有点的最短路径,比较已有的最短路径新确定点的最短路径加上该点到达目前点的路径,取较小值

对于本题,只用求完所有最短路径后,求出distance最大值,判断是否为无穷大(可设为某个特大值),若否则直接返回,若是则返回-1。
代码:

public int networkDelayTime(int[][] times, int n, int k) {
        int[][] graph = new int[n+1][n+1]; // 存图
        int[] distance = new int[n+1]; // 存已知的单源最短路径
        boolean[] found = new boolean[n+1]; // 存节点最短路径是否被确定
        final int INF = Integer.MAX_VALUE/2;
        for (int i = 0; i < n+1; i++) { // 初始化
            Arrays.fill(graph[i], INF);
        }
        for (int[] edge : times) { // 初始化
            int source = edge[0];
            int target = edge[1];
            int cost = edge[2];
            graph[source][target] = cost;
        }
        Arrays.fill(distance, INF); // 初始化
        distance[k] = 0;
        distance[0] = 0;
        for (int i = 1; i <= n; i++) {
            // x为当前还未确定节点的中的最短路径目标点
            int x = -1;
            for (int j = 1; j <= n; j++) {
                // 如果当前节点的最短路径未确定,且已知的未确定最短路径中当前节点最短路径更短
                if (!found[j] && (x == -1 || distance[j] < distance[x])) {
                    x = j;
                }
            }
            found[x] = true;
            for (int j = 1; j <= n; j++) { // 更新最短路径集合
                distance[j] = Math.min(distance[j], distance[x] + graph[x][j]);
            }
        }
        int ans = Arrays.stream(distance).max().getAsInt();
        return ans != INF ? ans : -1;
    }
### 力扣上的Prim算法相关问题及其解决方案 #### 什么是Prim算法? Prim算法是一种用于寻找图的最小生成树(Minimum Spanning Tree, MST)的经典贪心算法。它通过逐步扩展已有的树节点集合,每次选择连接当前集合与其他未访问节点之间权重最小的边加入到树中,直到覆盖所有节点为止[^1]。 #### LeetCode上涉及Prim算法的相关题目 以下是几个可能涉及到Prim算法的典型LeetCode题目: 1. **1135. Connecting Cities With Minimum Cost** - 题目描述:给定一组城市以及它们之间的连通成本,求将这些城市全部连通所需的最低总成本。 - 解决方案:此问题可以直接应用Prim算法来构建最小生成树。初始时可以选择任意一个城市作为起点,不断向其他尚未被访问的城市扩展,每次都选取权值最小的可用边[^2]。 ```python import heapq def minimumCost(n, connections): graph = [[] for _ in range(n)] # 构建邻接表表示加权无向图 for city1, city2, cost in connections: graph[city1-1].append((cost, city2-1)) graph[city2-1].append((cost, city1-1)) visited = set() total_cost = 0 min_heap = [(0, 0)] # 初始堆为(代价, 节点索引) while len(visited) < n and min_heap: cost, u = heapq.heappop(min_heap) if u not in visited: visited.add(u) total_cost += cost for next_cost, v in graph[u]: if v not in visited: heapq.heappush(min_heap, (next_cost, v)) return total_cost if len(visited) == n else -1 ``` 2. **743. Network Delay Time** - 题目描述:计算信号从源节点传播至所有其他节点所需的最大时间。虽然该问题是关于最短路径而非MST,但某些变体可以用类似的思路处理。 - 复杂度分析:由于需要遍历整个网络更新延迟时间,因此空间复杂度达到 \( O(N^2) \)[^5]。 #### 推荐学习资源 为了更好地掌握Prim算法及相关知识点,建议参考以下资料: - 使用《Elements of Programming Interviews》中的C++代码实例进一步巩固理论基础[^4]; - 结合实际动手实践,在上述提到的各种在线平台上完成更多类似习题训练[^3]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三更鬼

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值