我有一个图形,该图形具有到“起始”节点的计算距离。现在,我想删除一个节点(起始节点除外)并重新计算距离(理想情况下,在整个图形上不运行“最短路径优先”)。
我不知道该如何搜索这样的算法,而且我的尝试似乎非常复杂(尤其是与添加新节点相比)。
答案 0 :(得分:2)
实现Dijkstra算法的一种方法是维护一组节点,这些节点距起点的距离需要更新。有效地更新节点的距离后,该节点将从集合中删除,但其所有邻居都添加到集合中。如果节点的更新即无效,则当该节点的距离不变时,该节点将从集合中删除,并且不添加任何节点。该算法的暂停条件是“无需更新任何节点”。
从图中删除一个节点时,需要更新其所有邻居以反映该删除。
因此,您可以简单地在图上“重新启动” Dijkstra的算法,具有距您已有的起始节点的初始距离,并使用要删除的节点的邻居初始化要更新的节点集。更新自然会传播到最终将需要更新的任何节点。
注意:如果图形是定向的,则仅需要将具有从已删除节点到来的边缘的节点添加到要更新的节点集中。
答案 1 :(得分:0)
删除属于一组最小路径的节点可能需要重新计算到它们的末端节点的所有距离。使用here中发现的Dijkstra算法的伪代码:
1 function Dijkstra(Graph, source):
2
3 create vertex set Q
4
5 for each vertex v in Graph:
6 dist[v] ← INFINITY
7 prev[v] ← UNDEFINED
8 add v to Q
10 dist[source] ← 0
11
12 while Q is not empty:
13 u ← vertex in Q with min dist[u]
14
15 remove u from Q
16
17 for each neighbor v of u: // only v that are still in Q
18 alt ← dist[u] + length(u, v)
19 if alt < dist[v]:
20 dist[v] ← alt
21 prev[v] ← u
22
23 return dist[], prev[]
prev
数组包含最小生成树(=所有最短路径的树)中每个节点的前一个节点。因此,要删除节点r
,并假设您在删除之前仍然拥有dist
和prev
数组,可以将其更改为:
function DijkstraRemove(Graph, dist, prev, removed):
create vertex set Q
for each vertex v in Graph:
while (prev[v] != UNDEFINED):
if prev[v] == removed:
add v to Q
dist[v] = UNDEFINED
prev[v] = UNDEFINED
break
else:
v = prev[v]
// continue with line 12 above