力扣 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;
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三更鬼

谢谢老板!

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

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

打赏作者

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

抵扣说明:

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

余额充值