743. Network Delay Time
阿新 • • 發佈:2018-12-20
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; } }