C++ Prim’;用于邻接列表表示的s MST

C++ Prim’;用于邻接列表表示的s MST,c++,prims-algorithm,min-heap,C++,Prims Algorithm,Min Heap,我试图用min Heap实现Prim的算法。 这是我指的链接 我想知道为什么我们可以使用向量并使用std::sort函数来代替min-heap对其进行排序。您可以,但请记住,每次向MST添加新节点时,您都必须更新跨分区的边集(边到MST中尚未包含的节点),因此,您必须在算法的每次迭代中对向量进行排序,这将浪费时间,因为您只需要知道在该迭代中穿过分区的哪些边具有最小值,最小堆对于该操作是最佳的,因为其提取最小值的时间复杂度为O(log n)当排序为O(n log n)时,这会使算法在大型或密集图

我试图用min Heap实现Prim的算法。 这是我指的链接


我想知道为什么我们可以使用向量并使用
std::sort
函数来代替min-heap对其进行排序。

您可以,但请记住,每次向MST添加新节点时,您都必须更新跨分区的边集(边到MST中尚未包含的节点),因此,您必须在算法的每次迭代中对向量进行排序,这将浪费时间,因为您只需要知道在该迭代中穿过分区的哪些边具有最小值,最小堆对于该操作是最佳的,因为其提取最小值的时间复杂度为
O(log n)
当排序为
O(n log n)
时,这会使算法在大型或密集图形上运行较慢。

可以,但请记住,每次向MST添加新节点时,都必须更新穿过分区的边集(边到MST中尚未包含的节点),因此,您必须在算法的每次迭代中对向量进行排序,这将浪费时间,因为您只需要知道在该迭代中穿过分区的哪些边具有最小值,最小堆对于该操作是最佳的,因为其提取最小值的时间复杂度为
O(log n)
当排序为
O(n log n)
时,这会使算法在大型或密集图形上运行较慢。

请不要提供链接作为第一个信息源。相反,请复制/粘贴相关部分(可能前缀为
以将其标记为cite),并提供链接以供参考。请不要提供链接作为第一个信息来源。相反,复制/粘贴相关部分(可能前缀为
以将其标记为cite),并提供额外的链接以供参考。我们可以使用与min heap具有相同时间复杂性的set吗?当然,一个
std::set
可以做到这一点,唯一的细节是它不允许重复元素,因此,在图中有几个可能的MST的情况下,你会得到一致的一个,这取决于你在交叉边上迭代的顺序,但只有当你被明确要求得到一个特定的MST或所有可能的MST时,这才可能是一个问题,否则你是好的。只是其他一些事情,如果要在何处使用
std::set
,则需要使用一个结构来保存边的权重及其连接的节点的id,并为其定义一个比较函数来比较项,
std::map
,其中边的权重作为键,节点的id尚未在MST中,这种方法更容易存档相同的结果,这就是我当时实现它的方式。我们可以使用像min heap一样具有相同时间复杂度的集合吗?当然,一个
std::set
可以做到这一点,唯一的细节是它不允许重复的元素,所以在图中有几个可能的MST的情况下,你会得到一致的结果,这取决于你在交叉边上迭代的顺序,但只有当你被明确要求获得一个特定的MST或所有可能的MST时,这才可能是一个问题,否则你是好的。只是其他一些事情,如果要在何处使用
std::set
,则需要使用一个结构来保存边的权重及其连接的节点的id,并为其定义一个比较函数来比较项,
std::map
,其中边的权重作为键,节点的id尚未在MST中,这种方法更容易存档相同的结果,这就是我当时实现它的方式。