leetcode 743. Network Delay Time | 743. 网络延迟时间(邻接矩阵,Dijkstra 算法)

x33g5p2x  于2021-11-26 转载在 其他  
字(1.2k)|赞(0)|评价(0)|浏览(452)

题目

https://leetcode.com/problems/network-delay-time/

题解

有向图,求源点到所有顶点的最短距离,经典 Dijkstra 算法,只要知道思路就能实现,然而每次思路都要重新查一遍,过几个月又忘了。。

Dijkstra 算法

1)Dijkstra 算法必须指定一个源点
2)生成一个源点到各个点的最小距离表,一开始只有一条记录,即原点到自己的最小距离为0,源点到其他所有点的最小距离都为正无穷大
3)从距离表中拿出没拿过记录里的最小记录,通过这个点发出的边,更新源点到各个点的最小距离表,不断重复这一步
4)源点到所有的点记录如果都被拿过一遍,过程停止,最小距离表得到了

草稿

实现的时候,我一开始有个更新细节写错了(line 29),照着三叶的 答案 对比了一下,改过来了,才 AC。

另外,Dijkstra 是可以用 heap 做优化的,详见答案,有空再优化下。

  1. class Solution {
  2. public int networkDelayTime(int[][] times, int n, int k) {
  3. int[][] edge = new int[n + 1][n + 1];
  4. for (int i = 0; i <= n; i++) {
  5. Arrays.fill(edge[i], Integer.MAX_VALUE);
  6. edge[i][i] = 0;
  7. }
  8. for (int[] t : times) {
  9. edge[t[0]][t[1]] = t[2];
  10. }
  11. int[] dist = new int[n + 1];
  12. boolean[] visited = new boolean[n + 1];
  13. for (int i = 0; i <= n; i++) {
  14. dist[i] = edge[k][i];
  15. }
  16. visited[k] = true;
  17. int count = 1;
  18. while (count < n) {
  19. int idx = 0;
  20. for (int i = 1; i <= n; i++) {
  21. if (!visited[i] && dist[idx] > dist[i]) idx = i;
  22. }
  23. visited[idx] = true;
  24. count++;
  25. for (int i = 1; i <= n; i++) { // k->idx->i
  26. if (!visited[i] && edge[idx][i] != Integer.MAX_VALUE && dist[idx] + edge[idx][i] < dist[i]) {
  27. dist[i] = dist[idx] + edge[idx][i]; // k->i = k->idx(=dist[idx]) + idx->i
  28. }
  29. }
  30. }
  31. int result = 0;
  32. for (int i = 1; i <= n; i++) {
  33. result = Math.max(result, dist[i]);
  34. }
  35. return result == Integer.MAX_VALUE ? -1 : result;
  36. }
  37. }

相关文章