我正在努力解决这个问题:
Gaedel教授写了一个程序,他声称实现了Dijkstra的算法。 程序为V中的每个顶点v生成v.d和v.π。给出一个 O.(V + E)-time算法检查教授程序的输出。这应该 确定d和π属性是否与某些最短路径树的属性匹配。 您可以假设所有边权重都是非负的。
v.d是从起始节点到v的最短距离。 v.π是v从起始节点到v
的最短路径中的前身我的想法是: 对于每个顶点(i),将i.d与(i.π).d进行比较。如果我的前任有一个更大的d值,那么我们就不能有一个最短路径的树。
我相信这可以检查教授的输出是不是最短路径树,但我不认为它可以确认输出是最短路径树。没有更多信息,我想不出办法做到这一点。
我是在正确的轨道上吗?
答案 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
次。