LeetCode 743. 网络延迟时间 【最短路】

题目

有 n 个网络节点,标记为 1 到 n。

给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。

现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。

示例 1:

在这里插入图片描述

输入:times = [[2,1,1],[2,3,1],[3,4,1]], n = 4, k = 2
输出:2
示例 2:

输入:times = [[1,2,1]], n = 2, k = 1
输出:1
示例 3:

输入:times = [[1,2,1]], n = 2, k = 2
输出:-1

提示:

1 <= k <= n <= 100
1 <= times.length <= 6000
times[i].length == 3
1 <= ui, vi <= n
ui != vi
0 <= wi <= 100
所有 (ui, vi) 对都 互不相同(即,不含重复边)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/network-delay-time
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

弗洛伊德算法求带权有向图最短路径

class Solution {
    public int networkDelayTime(int[][] times, int n, int k) {
        int INF=Integer.MAX_VALUE;
        int[][] d=new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(i==j) d[i][j]=0;
                else d[i][j]=INF;
            }
        }
        for(int i=0;i<times.length;i++){
            d[times[i][0]-1][times[i][1]-1]=times[i][2];
        }
        for(int l=0;l<n;l++){
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    if(d[i][l]<INF&&d[l][j]<INF){
                        d[i][j]=Math.min(d[i][j],d[i][l]+d[l][j]);
                    }
                }
            }
        }
        int ans=-1;
        for(int i=0;i<n;i++){
            if((k-1)!=i){
                if(d[k-1][i]==INF) return -1;
                else ans=Math.max(ans,d[k-1][i]);
            }
        }
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wydxry

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值