Dijkstra算法

class Solution {
    public int networkDelayTime(int[][] times, int N, int K) {
        int[]dp=new int[N+1];
        Arrays.fill(dp,Integer.MAX_VALUE);
        dp[K]=0;
        for(int i=0;i<N;i++){
            for(int[]lv:times){
                int from=lv[0],to=lv[1],cost=lv[2];
                if(dp[from]!=Integer.MAX_VALUE){
                    dp[to]=Math.min(dp[from]+cost,dp[to]);
                }
            }
        }
        int max=-1;
        dp[0]=0;
        for(int cost:dp){
            max=Math.max(cost,max);
        }
        return max==Integer.MAX_VALUE?-1:max;
    }
}

这里,每遍历一次,至少一个顶点的所有边被使用。

Dijkstra算法,每进行一次迭代,增加若干条新边,可以有新的路径到达若干个顶点;

那么,如果新路径产生的效果则是,若dp[to]>dp[from]+cost,则更新距离。

最后当所有的新边都用完的时候,最短路径即为真最短路径

那么,到底要迭代多少次呢?每一次迭代,产生新边,若不产生新的被访问的顶点,则以后都不会再产生了(因为这些顶点已经全部被访问过了,无论之后再怎么迭代,都是老样子)。只要产生,至少产生一个,因此最多迭代N次即可(每一次迭代,必然至少访问完一个)!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值