题目描述:
标签:深度优先搜索 广度优先搜索 图 最短路 堆(优先队列)
有 n 个网络节点,标记为 1 到 n。
给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。
现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。
代码:
思路分析:Dijkstra算法,求一点到其他节点的最短距离
1、定义权重矩阵g[n][n],最短距离矩阵dist[n],是否访问矩阵used[n]
2、第一层循环,以当前源节点为出发点,更新最短距离
3、第二层循环,找到除了源节点以外当前最短距离最小的节点
4、使用Arrays.stream(dist).max().getAsInt()来找到最大的距离,并与INF比较,相等则返回-1,不等则返回ans
class Solution {
public int networkDelayTime(int[][] times, int n, int k) {
final int INF = Integer.MAX_VALUE / 2;
int[][] g = new int[n][n];
for(int i = 0;i < n;i++){
Arrays.fill(g[i], INF);
}
for(int[] t : times){
int x = t[0] - 1;
int y = t[1] - 1;
g[x][y] = t[2];
}
int[] dist = new int[n];
Arrays.fill(dist, INF);
dist[k-1] = 0;
boolean[] used = new boolean[n];
for(int i = 0;i < n;i++){
int x = -1;
for(int y = 0;y < n;y++){
if(!used[y] && (x == -1 || dist[y] < dist[x])){
x = y;
}
}
used[x] = true;
for(int y = 0;y < n;y++){
dist[y] = Math.min(dist[y], dist[x] + g[x][y]);
}
}
int ans = Arrays.stream(dist).max().getAsInt();
return ans == INF? -1 : ans;
}
}