【发布时间】:2018-12-18 06:09:38
【问题描述】:
我知道 Prim 的算法以及如何实现它。我也知道为什么它的时间复杂度是 O(E + V log(V))。
我们添加边 E 次(即 O(E))并选择最小 V 次(即 O(V*log(V))。但我不明白其中的一部分:为什么 V 次? ! 我知道一棵树有 V-1 条边,但如果最重的边必须在 MST 中,我们必须选择最少 E 次,而不是 V 次。
例如:一个完整的图,每条边的权重为 1,除了一个顶点,所有与其相连的边的权重为 10^18。
【问题讨论】:
-
您将顶点放入队列中,而不是边。见en.wikipedia.org/wiki/Prim%27s_algorithm
-
但那是不可能的! c++ priority_queue 没有随机访问或任何类型的迭代器。
-
您问的是使用斐波那契堆,而不是 C++ 优先级队列。获得 O(E + V log V) 依赖于 C++ priority_queue 不提供的恒定摊销时间 reduction_key 操作。
标签: algorithm graph-theory minimum-spanning-tree disjoint-sets fibonacci-heap