There are N
network nodes, labelled 1
to N
.
Given times
, a list of travel times as directed edges times[i] = (u, v, w)
, where u
is the source node, v
is the target node, and w
is the time it takes for a signal to travel from source to target.
Now, we send a signal from a certain node K
. How long will it take for all nodes to receive the signal? If it is impossible, return -1
.
Note:
N
will be in the range[1, 100]
.K
will be in the range[1, N]
.- The length of
times
will be in the range[1, 6000]
. - All edges
times[i] = (u, v, w)
will have1 <= u, v <= N
and1 <= w <= 100
.
BFS求解,BFS求K点到各个定点的时间,取最大值即可;同时判断所有点是否连通,程序如下所示:
class Solution {
private boolean[] visited;
private int[] dist;
private int[][] weight;
private Set<Integer> set = new HashSet<>();
public int networkDelayTime(int[][] times, int N, int K) {
visited = new boolean[N];
dist = new int[N];
weight = new int[N][N];
Arrays.fill(dist, Integer.MAX_VALUE);
for (int i = 0; i < N; ++ i){
Arrays.fill(weight[i], -1);
}
for (int i = 0; i < times.length; ++ i){
weight[times[i][0] - 1][times[i][1] - 1] = times[i][2];
}
ArrayDeque<Integer> que = new ArrayDeque<>();
que.offer(K-1);
dist[K-1] = 0;
int cnt = 0;
while (!que.isEmpty()){
int node = que.poll();
cnt ++;
visited[node] = false;
set.add(node);
for (int i = 0; i < N; ++ i){
if (weight[node][i] != -1){
if (dist[i] > dist[node] + weight[node][i]){
dist[i] = dist[node] + weight[node][i];
if (!visited[i]){
que.offer(i);
visited[i] = true;
}
}
}
}
}
int res = 0;
for (int i = 0; i < N; ++ i){
res = Math.max(res, dist[i]);
}
return set.size() == N ? res:-1;
}
}