运行 迪杰斯特拉算法
Running Dijkstra Algorithm
给定这样一张图:
A
^ ^
/ \
3 4
/ \
B -- 5 -> C
E={(B,A)(C,A)(B,C)}
如果我们在节点 A 上 运行 Dijkstra 会怎样?
A 初始化为 0,B 和 C 初始化为无穷大,但 A 没有指向任何地方。
那我们在B和C中随机选择?或者算法在那种情况下不起作用?
谢谢!
Dijkstra 仍会 运行 并为您提供此图的正确答案。如果你这样选择,你可以只用起始节点初始化队列,并在你探索它们时添加或更新邻居 to/in 队列。在这种情况下,算法将在从队列中提取 (A) 并探索其零邻居的一次迭代后终止,适当地使到 B 和 C 的距离为无穷大(没有前一个节点)并使 A 的路径为零。如果您考虑一下,这就是所需的答案,因为没有从 A 到 B 或 C 的路径。
或者,如果您像 Wikipedia 那样实现它,在开始时将每个节点添加到队列中,它仍然会产生相同的结果。
1 function Dijkstra(Graph, source):
2 dist[source] ← 0 // Initialization
3
4 create vertex priority queue Q
5
6 for each vertex v in Graph:
7 if v ≠ source
8 dist[v] ← INFINITY // Unknown distance from source to v
9 prev[v] ← UNDEFINED // Predecessor of v
10
11 Q.add_with_priority(v, dist[v])
12
13
14 while Q is not empty: // The main loop
15 u ← Q.extract_min() // Remove and return best vertex
16 for each neighbor v of u: // only v that are still in Q
17 alt ← dist[u] + length(u, v)
18 if alt < dist[v]
19 dist[v] ← alt
20 prev[v] ← u
21 Q.decrease_priority(v, alt)
22
23 return dist, prev
提取 A 并探索它不存在的邻居后,没有任何更新。然后它将在 B 和 C 之间任意选择以提取下一个,因为它们具有相同的距离(当然不是 'randomly',仅取决于您如何从队列中 initialize/extract)。
当它检查 B 时,它会看到它可以在 Infinity + 5 中到达 C,并不比当前到 C of Infinity 的距离好多少,所以没有更新,并且在 Infinity + 3 中到达 A,不比 A 的好当前距离 0.
当它检查 C 时,它会看到它可以在 Infinity + 4 中到达 A,不比当前到 A 的距离 0 好,所以没有更新。
然后队列为空,返回dist[A] = 0, dist[B] = dist[C] = Infinity相同的结果。
因此 Dijkstra 的正确实现将能够处理这样的图(就像任何具有非负权重的有向图一样)。
给定这样一张图:
A
^ ^
/ \
3 4
/ \
B -- 5 -> C
E={(B,A)(C,A)(B,C)}
如果我们在节点 A 上 运行 Dijkstra 会怎样?
A 初始化为 0,B 和 C 初始化为无穷大,但 A 没有指向任何地方。
那我们在B和C中随机选择?或者算法在那种情况下不起作用?
谢谢!
Dijkstra 仍会 运行 并为您提供此图的正确答案。如果你这样选择,你可以只用起始节点初始化队列,并在你探索它们时添加或更新邻居 to/in 队列。在这种情况下,算法将在从队列中提取 (A) 并探索其零邻居的一次迭代后终止,适当地使到 B 和 C 的距离为无穷大(没有前一个节点)并使 A 的路径为零。如果您考虑一下,这就是所需的答案,因为没有从 A 到 B 或 C 的路径。
或者,如果您像 Wikipedia 那样实现它,在开始时将每个节点添加到队列中,它仍然会产生相同的结果。
1 function Dijkstra(Graph, source):
2 dist[source] ← 0 // Initialization
3
4 create vertex priority queue Q
5
6 for each vertex v in Graph:
7 if v ≠ source
8 dist[v] ← INFINITY // Unknown distance from source to v
9 prev[v] ← UNDEFINED // Predecessor of v
10
11 Q.add_with_priority(v, dist[v])
12
13
14 while Q is not empty: // The main loop
15 u ← Q.extract_min() // Remove and return best vertex
16 for each neighbor v of u: // only v that are still in Q
17 alt ← dist[u] + length(u, v)
18 if alt < dist[v]
19 dist[v] ← alt
20 prev[v] ← u
21 Q.decrease_priority(v, alt)
22
23 return dist, prev
提取 A 并探索它不存在的邻居后,没有任何更新。然后它将在 B 和 C 之间任意选择以提取下一个,因为它们具有相同的距离(当然不是 'randomly',仅取决于您如何从队列中 initialize/extract)。
当它检查 B 时,它会看到它可以在 Infinity + 5 中到达 C,并不比当前到 C of Infinity 的距离好多少,所以没有更新,并且在 Infinity + 3 中到达 A,不比 A 的好当前距离 0.
当它检查 C 时,它会看到它可以在 Infinity + 4 中到达 A,不比当前到 A 的距离 0 好,所以没有更新。
然后队列为空,返回dist[A] = 0, dist[B] = dist[C] = Infinity相同的结果。
因此 Dijkstra 的正确实现将能够处理这样的图(就像任何具有非负权重的有向图一样)。