验证O(V + E)中的Dijkstras算法

时间:2012-11-26 04:47:12

标签: algorithm graph computer-science dijkstra

我正在努力解决这个问题:

Gaedel教授写了一个程序,他声称实现了Dijkstra的算法。 程序为V中的每个顶点v生成v.d和v.π。给出一个 O.(V + E)-time算法检查教授程序的输出。这应该 确定d和π属性是否与某些最短路径树的属性匹配。 您可以假设所有边权重都是非负的。

v.d是从起始节点到v的最短距离。 v.π是v从起始节点到v

的最短路径中的前身

我的想法是: 对于每个顶点(i),将i.d与(i.π).d进行比较。如果我的前任有一个更大的d值,那么我们就不能有一个最短路径的树。

我相信这可以检查教授的输出是不是最短路径树,但我不认为它可以确认输出是最短路径树。没有更多信息,我想不出办法做到这一点。

我是在正确的轨道上吗?

1 个答案:

答案 0 :(得分:3)

认为这会起作用

执行DFS,但不是遵循常规图形边,而是仅遵循每个顶点的π值。你这样做是为了产生一个拓扑排序,所以第一个完成的顶点将是拓扑排序中的第一个顶点。请注意,您生成的topo排序中的第一个顶点将是为Gaedel算法提供的“源”顶点。

现在你有一个拓扑排序,你可以以最有效的顺序放松边缘,就像你在DAG上做的那样。

for each v in topoSortedVerts
    if v.d_verify != v.d_Gaedel
        //fail

    for each u in v.adjacencies
        relax(v, u)

if v.d_verify != v.d_Gaedel
    //fail

我认为您可能还需要确保考虑所有V顶点,并确保源顶点匹配。也许。另外,我猜想由π值引起的Gaedel的前身子图可能是真实的,并且有各种各样的疯狂事情,但我认为它没有。

它是O(V + E),因为外循环运行V次,内循环使用聚合分析运行E次。