宽度搜索 bfs。此题所求为时间而非距离,故最终结果为到某个节点的最大值。
此题的输入里,会有如下情况。
- 环;
- 多路时间比单路时间短;
- 多路时间与单路时间相同。
class Solution {
public int networkDelayTime(int[][] times, int N, int K) {
if (times == null) {
return -1;
}
Queue<Integer> queue = new LinkedList<>();
boolean[] visited = new boolean[N];
visited[K-1] = true;
int[] time = new int[N];
queue.add(K-1);
while (!queue.isEmpty()) {
int cur = queue.poll();
for (int i=0; i<times.length; i++) {
if (times[i][0] == cur + 1) {
int next = times[i][1] - 1;
// 为了避免环造成的死循环,但是多路时间比单路时间短时需要更新节点所需时间。这里需要为 >= ,否则也会造成死循环。
if (time[cur] + times[i][2] >= time[next] && visited[next]) {
continue;
}
visited[next] = true;
time[next] = time[cur] + times[i][2];
queue.offer(next);
}
}
}
for (boolean i : visited) {
if (!i) {
return -1;
}
}
int max = Integer.MIN_VALUE;
for (int i : time) {
if (max < i) {
max = i;
}
}
return max;
}
}