问题描述
我正在编写 Dijkstra 算法的实现,以了解酷图算法(这不是家庭作业,仅供参考)。我使用维基百科的 description 算法作为我的主要资源。
我测试了不同的遍历路径并得到以下结果((foo,bar)
表示foo to bar
):
crashes:
(e,f)
(f,d)
(c,a)
(f,g)
incorrect:
(a,c)
(g,f)
working:
(d,f)
我正在使用的图表如下所示:
F - H
| |
A ---- B - C
| /
| /
E - G - D
通过跟踪从 E
到 F
的路径,我大致了解了我的代码失败的原因。另一个问题是我不知道如何使用我的方式来实现算法。这是从 E
到 F
的跟踪:
在节点 E
,我的邻居是 A
和 G
。最短的暂定距离是 G
,因此它是下一个当前节点。 G
的邻居是 E
和 D
,但是 E
已经被遍历,所以 C
是下一个。对于C
,它的邻居D
被遍历,所以我们现在到达B
(B
和H
是等距的,但是它在{{ 1}} 的边列表)。这就是我的问题所在:
C
的暂定距离已经由 A
计算为 2。由于从 E
到 B
的新暂定距离远大于 2,因此距离保持在 A
。对于 2
,它的距离被设置为暂定距离,因为它被初始化为 F
。 infinity
的距离较小,因此被选为下一个节点。 A
的唯一邻居是 A
和 E
,它们已经被遍历过,所以它周围的所有节点都已经被探索过了。变量 B
(见下面我的代码)被初始化为一个节点,除了 closest
的 distance
之外没有其他填充字段,因此对于下一次迭代,它没有边,我遇到了分段错误。
我知道这是在我的代码中发生的事情,因为它的输出如下所示:
infinity
我在实现这个算法时哪里出错了?我试图非常仔细地遵循维基百科对它的 6 步描述。他们的描述和我的描述之间的唯一区别是我没有使用集合来跟踪已探索和未探索的节点(而是将数据保存在节点本身中)。请提供您能提供的任何见解。
注意:我在 Mac 上使用 Clang 进行编译,没有进行优化 (Current: e
New neighbor: a
New neighbor: g
g,closest,distance of 1
Current: g
New neighbor: d
d,distance of 2
Current: d
New neighbor: c
c,distance of 4
Current: c
New neighbor: b
New neighbor: h
b,distance of 5
Current: b
New neighbor: a
New neighbor: f
a,distance of 2
Current: a
?,distance of 1000
Current: ?
Segmentation fault: 11
)。我注意到,通过更高的优化,我的程序无限重复,然后给我另一个分段错误,但我在处理之前优先解决我的算法的中心问题。
-O0
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)