删除节点后重新计算距离

时间:2020-10-23 07:31:55

标签: algorithm

我有一个图形,该图形具有到“起始”节点的计算距离。现在,我想删除一个节点(起始节点除外)并重新计算距离(理想情况下,在整个图形上不运行“最短路径优先”)。

我不知道该如何搜索这样的算法,而且我的尝试似乎非常复杂(尤其是与添加新节点相比)。

2 个答案:

答案 0 :(得分:2)

实现Dijkstra算法的一种方法是维护一组节点,这些节点距起点的距离需要更新。有效地更新节点的距离后,该节点将从集合中删除,但其所有邻居都添加到集合中。如果节点的更新无效,则当该节点的距离不变时,该节点将从集合中删除,并且不添加任何节点。该算法的暂停条件是“无需更新任何节点”。

从图中删除一个节点时,需要更新其所有邻居以反映该删除。

因此,您可以简单地在图上“重新启动” Dijkstra的算法,具有距您已有的起始节点的初始距离,并使用要删除的节点的邻居初始化要更新的节点集。更新自然会传播到最终将需要更新的任何节点。

注意:如果图形是定向的,则仅需要将具有从已删除节点到来的边缘的节点添加到要更新的节点集中。

答案 1 :(得分:0)

@Stef表示敬意,我现在要扩展其answer

删除属于一组最小路径的节点可能需要重新计算到它们的末端节点的所有距离。使用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,并假设您在删除之前仍然拥有distprev数组,可以将其更改为:

 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                
相关问题