单源最短路径算法Dijkstra,算法思想 - 贪心
从给定点出发,每次以该点更新所以暂时还没有找到最短路径的点,最后当所有的点都更新完毕或者有点不能达到就返回相应的值。
JavaScript代码
/**
* @param {number[][]} times
* @param {number} n
* @param {number} k
* @return {number}
*/
var networkDelayTime = function(times, n, k) {
const inf = Number.MAX_SAFE_INTEGER;
// 新建一个表示图的二维数组
const g = new Array(n).fill(inf).map(() => new Array(n).fill(inf));
// 将题目中所给的数据变成一个图,把每条边都减去一为了保证每条边的范围都是[0, n-1]
for (let i = 0; i < times.length; i += 1) {
let x = times[i][0] - 1;
let y = times[i][1] - 1;
g[x][y] = times[i][2];
}
// 一个存放最短路径的数组
let dist = new Array(n).fill(inf);
// 存放表示这个点是不是已经是找到最短路径了
let used = new Array(n).fill(false);
dist[k-1] = 0;
for (let i = 0; i < n; i += 1) {
let x = -1;
// 遍历dist,找到最短的那个点
for (let j = 0; j < n; j += 1) {
if (!used[j] && (x === -1 || dist[j] < dist[x])) {
x = j
}
}
// 更新这个点表示已经被使用了
used[x] = true;
// 用当前我们找到的这个节点去更新我们我们所有节点的最短路径
for (let j = 0; j < n; j += 1) {
dist[j] = Math.min(dist[j], dist[x] + g[x][j]);
}
}
// 找到最大值
let ans = Math.max(...dist);
return ans === inf ? -1 : ans;
};