使用C ++和STL实现Dijkstra的最短路径算法

时间:2014-05-11 11:51:39

标签: c++ stl

我正在尝试使用C ++和STL实现Dijkstra的最短路径算法。由于STL的优先级队列不支持减少键操作,因此我决定使用常规有序集。我的算法几乎与this one相同。

然而,我有些担忧。也就是说,集合中边缘的排序将取决于目的地的顶点数和权重(因为将使用regular relational operators of std::pair)。我相信它应该只取决于重量。如果我通过使用自定义比较器来声明该集合,该比较器仅比较权重,我将如何使std::set::erase工作,因为需要擦除相同顶点之间的边但具有更大的权重?

你们还能想到其他任何瑕疵吗?或者你可能有比使用std::set更好的想法?

每个人都有一个美好的星期天。

1 个答案:

答案 0 :(得分:1)

您的问题似乎混淆了技术实现和算法。

首先,在技术方面,对于std :: set,您似乎需要特殊的排序以及某些元素的擦除。可以通过自定义比较器更改排序,例如,请参阅here。但是,我不会仅仅通过权重来排序,因为可能存在重复。只需将权重放在具有更高优先级的std::pair组件中( - 第一个组件)。

接下来,为了擦除元素,首先必须确定哪一个元素是通过提供指向该元素的迭代器来完成的。此步骤完全不受您的自定义比较功能的影响。

快速总结:你应该(i)找出需要准确删除的元素,(ii)通过std::set::find找到相应的迭代器,然后(iii)擦除它们。对我来说,好像第一点就是这里的问题。