曹耘豪的博客

Dijkstra:单源最短路径算法

  1. 算法流程
  2. 代码实现

算法流程

  1. 找到距离起点最近的未访问过的点a,如果是第一次就是起点
  2. 通过a,计算a的所有邻居节点距离起点的最近距离
  3. 将a标记为已访问
  4. 重复步骤1,直到所有点访问过

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
const inf = math.MaxInt32

func networkDelayTime(distances [][]int, n int, k int) int {
// 格式化输入,记录i到j的距离
distanceMap := make([][]int, n)
for i := range distanceMap {
distanceMap[i] = make([]int, n)
for j := range distanceMap[i] {
// 默认最大
distanceMap[i][j] = inf
}
}
for _, d := range distances {
distanceMap[d[0] - 1][d[1] - 1] = d[2]
}

// 记录起点到其他点的最短距离
dist := make([]int, n)
for i := range dist {
dist[i] = inf
}
dist[k - 1] = 0

// 标记点已被访问过
visited := make([]bool, n)

for i := 0; i < n; i++ {
// 寻找距离起点最近的点,第一次的话就是起点
closest := -1
for candicate, v := range visited {
if !v && (closest == -1 || dist[candicate] < dist[closest]) {
closest = candicate
}
}

visited[closest] = true

// 更新邻居节点的距离
for ne, d := range distanceMap[closest] {
// inf说明不是邻居节点
if d == inf {continue}
dist[ne] = Min(dist[ne], dist[closest] + d)
}
}

ans := -inf
for _, d := range dist {
if d == inf {
return -1
}
ans = Max(ans, d)
}

return ans
}

func Min(a, b int) int {
if a < b {
return a
}
return b
}

func Max(a, b int) int {
if a > b {
return a
}
return b
}