首页 文章

Dijkstra的拓扑排序算法

提问于
浏览
1

我在教科书中看到了这段经文:

“如果图形是非循环的,我们可以改进Dijkstra算法 . 顶点可以按拓扑顺序选择,因为当选择顶点时,它的距离不能再降低,因为没有来自未知节点的入射边缘 . ”

我理解拓扑排序和Dijkstra的算法,但不理解拓扑顺序如何帮助加速Dijkstra,特别是当订单并不总是唯一时 . (除非它指的是没有意义的空间复杂性)

有人能解释一下如何改进它并举个例子吗?

1 回答

  • 0

    您可以选择任意拓扑排序并按此顺序处理顶点 .

    时间复杂度在图的大小上是线性的,因为不再需要优先级队列 . 您可以按拓扑顺序迭代所有顶点并计算它们的距离 .

    它是这样的:

    dist = 0 for the start vertex and +inf for the rest
    for v in topological order:
         for u in neighbors[v] in reverse graph:
            dist[v] = min(dist[v], dist[u] + weight(u, v))
    

    正确性来自这样一个事实,即当我们到达 v 时,我们已经处理了所有具有边缘的顶点到 v (通过拓扑顺序的定义) .

相关问题