【问题标题】:Verify Dijkstras algorithm in O (V + E) [closed]在 O(V + E)中验证 Dijkstras 算法 [关闭]
【发布时间】:2012-11-13 13:44:48
【问题描述】:

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

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

v.d 是从起始节点到 v 的最短距离。 v.π 是 v 在从起始节点到 v 的最短路径中的前任

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

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

我走对了吗?

【问题讨论】:

  • 你打算在什么时候实现这个,使用什么?运行 SPA 并查看它是否是树。它是有效的,并且是最著名的。
  • 我不确定 SPA 是什么。这个问题来自于算法介绍第 3 版。我想我只需要提供一个通用的算法;我不需要指定数据结构。我提出的解决方案在 O (E + V) 中运行,因为我访问了每个顶点和边一次,但我不确定它是否正确。
  • 最短路径算法。迪杰斯特拉的。最著名的算法之一。
  • Dijkstra 在 O (E + VlogV) 中运行,所以我不能使用它。它还可能生成与教授生成的不相等的最短路径树。

标签: algorithm graph computer-science dijkstra


【解决方案1】:

认为这可行

做一个 DFS,但不是遵循规则的图边,而是只遵循每个顶点的 π 值。您这样做是为了产生拓扑排序,以便完成的第一个顶点将是拓扑排序中的第一个顶点。请注意,您生成的拓扑排序中的第一个顶点将是提供给 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 次使用聚合分析。

【讨论】:

  • 是的,这似乎有效。使用顶级排序来查找最短路径图与我正在使用的图相距几节。此方法将给出正确的起始顶点,并应从教授创建的最短路径图重新创建相同的最短路径图。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多