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次即可(每一次迭代,必然至少访问完一个)!