确定从s到t的所有最短路径是否包含边缘e

时间:2013-03-04 00:29:35

标签: graph-algorithm dijkstra shortest-path bellman-ford

设G =(V; E)是有向图,其边缘都具有非负权重。设s,t为V中的2个顶点,并且e为E中的边。 描述一种算法,该算法决定从s到t的所有最短路径是否包含边e。

嗯,这就是你如何实现Dijsktra的时间复杂性: 只需从s运行Dijkstra并计算delta(s,t)(从s到t的最短路径的权重)。 删除边e,然后从新图中的s再次运行Djikstra。 如果新图中的delta(s,t)增加,则意味着从s到t的所有最短路径都包含边e,否则它不是真的。

我想知道是否有更有效的算法来解决这个问题。你认为有可能击败Dijkstra的时间复杂度吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

你的方法听起来对我不对。您只需计算最短路径,无论是否具有前沿e。这为你提供了2次Dij​​kstra搜索。

如果你去A *,双向搜索或恢复你的Dijkstra搜索树,还有改进的空间:

  • A *会加快您的Dijkstra查询速度,但是您的图表可能无法实现,因为您需要能够定义剩余距离的良好界限。
  • 双向搜索可以在两个搜索边缘相遇的情况下完成。然后,您可以检查所有带有和不带边缘的路径,只有一个快速双向查询+两个案例的额外工作,而不是两个非常相似的完整Dijkstra
  • 您可以在没有边缘的情况下搜索一次并维护搜索树。然后添加e并从e的起点开始更新最短路径树。如果终点的标签>使用e时,起始点的标签+长度e,可以更快地达到终点。递归搜索终点的邻居,只有在比以前更快到达时才更新距离。应该为你节省一些工作。