题目来源:https://leetcode-cn.com/problems/network-delay-time/
大致题意:
给出一个(起点,目的点,边长)的集合,然后给出一个源点,求出到其他所有点的单源最短路径。
若源点能到达所有目的点,则返回最长的最短路径,否则返回-1。
思路
单源最短路径,就选 dijkstra
dijkstra
可求出源点到其他点的最短路径。
首先需要有两个数组,一个distance存已知的最短路径(初始时源点位置为0,其他点为无穷大),一个found存已确定的最短路径目的点。
接着:
- 遍历所有点
- 对于当前遍历的节点,在未确定最短路径的点集中求出目前的最短路径点
- 上一步所求点,可以确定当前它的最短路径即为当前distance的内容
- 更新所有点的最短路径,比较已有的最短路径 和 新确定点的最短路径加上该点到达目前点的路径,取较小值
对于本题,只用求完所有最短路径后,求出distance最大值,判断是否为无穷大(可设为某个特大值),若否则直接返回,若是则返回-1。
代码:
public int networkDelayTime(int[][] times, int n, int k) {
int[][] graph = new int[n+1][n+1]; // 存图
int[] distance = new int[n+1]; // 存已知的单源最短路径
boolean[] found = new boolean[n+1]; // 存节点最短路径是否被确定
final int INF = Integer.MAX_VALUE/2;
for (int i = 0; i < n+1; i++) { // 初始化
Arrays.fill(graph[i], INF);
}
for (int[] edge : times) { // 初始化
int source = edge[0];
int target = edge[1];
int cost = edge[2];
graph[source][target] = cost;
}
Arrays.fill(distance, INF); // 初始化
distance[k] = 0;
distance[0] = 0;
for (int i = 1; i <= n; i++) {
// x为当前还未确定节点的中的最短路径目标点
int x = -1;
for (int j = 1; j <= n; j++) {
// 如果当前节点的最短路径未确定,且已知的未确定最短路径中当前节点最短路径更短
if (!found[j] && (x == -1 || distance[j] < distance[x])) {
x = j;
}
}
found[x] = true;
for (int j = 1; j <= n; j++) { // 更新最短路径集合
distance[j] = Math.min(distance[j], distance[x] + graph[x][j]);
}
}
int ans = Arrays.stream(distance).max().getAsInt();
return ans != INF ? ans : -1;
}