Algorithm Dag的最短路径

Algorithm Dag的最短路径,algorithm,graph,shortest-path,directed-acyclic-graphs,Algorithm,Graph,Shortest Path,Directed Acyclic Graphs,我有一个带有s和t顶点的图,我需要找到它们之间的最短路径。该图有很多我想利用的特殊属性: 该图是一个DAG(有向无环图) 我可以在O(| V |)时间内创建拓扑排序,比传统的O(| V+E |)更快 在拓扑排序中,s是列表中的第一项,t是最后一项 有人告诉我,一旦我有了一个顶点的拓扑排序,我就可以比我目前的Dijkstra统一代价标准更快地找到最短路径,但我似乎找不到它的算法 伪代码将非常受欢迎 编辑: 从s到t的所有路径都具有相同数量的边。 边具有权重。 我正在寻找成本最低的路径。我将违背

我有一个带有s和t顶点的图,我需要找到它们之间的最短路径。该图有很多我想利用的特殊属性:

  • 该图是一个DAG(有向无环图)
  • 我可以在O(| V |)时间内创建拓扑排序,比传统的O(| V+E |)更快
  • 在拓扑排序中,s是列表中的第一项,t是最后一项
有人告诉我,一旦我有了一个顶点的拓扑排序,我就可以比我目前的Dijkstra统一代价标准更快地找到最短路径,但我似乎找不到它的算法

伪代码将非常受欢迎

编辑: 从s到t的所有路径都具有相同数量的边。 边具有权重。
我正在寻找成本最低的路径。

我将违背直觉,假设这不是家庭作业。您必须利用拓扑排序提供的信息。无论何时以拓扑顺序检查节点n,都可以保证已经遍历了n的所有可能路径。使用此选项,可以清楚地看到,通过拓扑排序(伪代码)的一次线性扫描,可以生成最短路径:


现在,您可以查找从s到目的地的任何最短路径。您只需在成本映射中查找目的地,获取其父节点,然后重复此过程,直到获得父节点为s的节点,然后您就有了最短的路径。

要澄清,您是在试图找到最小的距离还是最少的边数?边有不同的长度吗?另外,你能在最短路径中遍历备份链接吗,还是只能向下遍历?谢谢你的回答,但我似乎不明白e.dest是什么意思?有人能澄清一下吗?这里的边实际上是有向弧。e、 dest是边缘指向的节点。“dest”代表“destination”。我认为关于放松节点e.dest的伪代码可能有点问题。是否应该是{if cost[e.dest].cost>cost[v].cost+e.weight;}?
Graph g
Source s
top_sorted_list = top_sort(g)

cost = {} // A mapping between a node, the cost of its shortest path, and 
          //its parent in the shortest path

for each vertex v in top_sorted_list:
  cost[vertex].cost = inf
  cost[vertex].parent = None

cost[s] = 0

for each vertex v in top_sorted_list:
   for each edge e in adjacensies of v:
      if cost[e.dest].cost > cost[v].cost + e.weight:
        cost[e.dest].cost =  cost[v].cost + e.weight
        e.dest.parent = v