繁体   English   中英

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

[英]Implementing Dijkstra's shortest path algorithm using C++ and STL

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

但是 ,我有些担心。 也就是说,集合中边的排序将取决于目标的顶点数和权重(因为将使用std::pair常规关系运算符 )。 我确实相信它应该仅取决于重量。 如果我要通过使用仅比较权重的自定义比较器来声明集合,我将如何使std::set::erase工作,因为需要擦除相同顶点之间的边但权重更大?

你们还有其他缺陷可以想到吗? 还是您可能比使用std::set有更好的主意?

祝大家星期天愉快。

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

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

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

快速总结:您应该(i)找出需要精确擦除的元素,(ii)通过std::set::find相应的迭代器,以及(iii)擦除它们。 在我看来,似乎第一点就是这里的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM