【发布时间】:2026-01-10 18:30:01
【问题描述】:
我正在研究 UVa 问题集中的this graph problem。这是一个没有负边权重的单源最短路径问题。从我收集到的信息来看,对于此类问题具有最佳 big-O 运行时间的算法是 Dijkstra,它使用 Fibonacci 堆作为优先级队列,尽管实际上二进制堆更容易实现并且效果也很好。
然而,看起来即使是二叉堆也需要相当长的时间才能滚动,而且在竞争中时间是有限的。我知道 STL 提供了一些堆算法和优先级队列,但它们似乎没有提供 Dijkstra 需要的减少键功能。还是我错了?
似乎另一种可能性是根本不使用 Dijkstra 的。 This forum thread 有人声称他们通过广度优先搜索 / Bellman-Ford 解决了上述问题,这更容易编码。 (编辑:OTOH,Dijkstra 的优先级队列的未排序数组超时。)BFS/Bellman-Ford 的工作让我有点惊讶,因为我认为输入大小非常大。我想不同的问题需要不同复杂性的解决方案,但我的问题是,我需要多久在这样的比赛中使用 Dijkstra 的?我应该更多地练习更简单但更慢的算法吗?
【问题讨论】: