最短路算法(网络延迟时间)

在这里插入图片描述
Dijkstra算法功能:给出加权连通图中一个顶点,称之为起点,找出起点到其它所有顶点之间的最短距离。
在这里插入图片描述
在这里插入图片描述
将所有节点分成两类:已确定从起点到当前点的最短路长度的节点,以及未确定从起点到当前点的最短路长度的节点(下面简称「未确定节点」和「已确定节点」)。

每次从「未确定节点」中取一个与起点距离最短的点,将它归类为「已确定节点」,并用它「更新」从起点到其他所有「未确定节点」的距离。直到所有点都被归类为「已确定节点」。

用节点 AA「更新」节点 BB 的意思是,用起点到节点 AA 的最短路长度加上从节点 AA 到节点 BB 的边的长度,去比较起点到节点 BB 的最短路长度,如果前者小于后者,就用前者更新后者。这种操作也被叫做「松弛」。

这里暗含的信息是:每次选择「未确定节点」时,起点到它的最短路径的长度可以被确定。

可以这样理解,因为我们已经用了每一个「已确定节点」更新过了当前节点,无需再次更新(因为一个点不能多次到达)。而当前节点已经是所有「未确定节点」中与起点距离最短的点,不可能被其它「未确定节点」更新。所以当前节点可以被归类为「已确定节点」。

class Solution {
    public int networkDelayTime(int[][] times, int n, int k) {
    int inf=Integer.MAX_VALUE/2;
    int [][]pic=new int[n][n];
    int []distance=new int[n];
    boolean []pass=new boolean[n];
    Arrays.fill(distance,inf);
    for(int i=0;i<n;i++){
        Arrays.fill(pic[i],inf);
    }
     for(int i=0;i<times.length;i++){
         pic[times[i][0]-1][times[i][1]-1]=times[i][2];
     }
     distance[k-1]=0;
     for(int i=0;i<n;i++){
         int idx=-1;
        for(int j=0;j<n;j++){
            if(!pass[j]&&(idx==-1||distance[j]<distance[idx]))
            idx=j;
        }
        pass[idx]=true;
        for(int j=0;j<n;j++){
            distance[j]=Math.min(distance[j],distance[idx]+pic[idx][j]);
        }
     }
     int ans=Arrays.stream(distance).max().getAsInt();
    return ans==inf?-1:ans;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值