问题描述
最小生成树算法,在稀疏图时,Kruscal复杂度更低,我们可以使用堆优化的prim算法达到与Kruscal一样的复杂度。
Prim算法本身的时间复杂度是O(N^2)的,而在这个算法中,使用了堆来维护所有的边,操作数一共是O(M)级别的,所以复杂度是O(MlogM)的!而Kruscal算法的时间复杂度是O(MlogM + M * Ackermann’(M)),总的说来,是优化到了和Kruscal算法同样级别了呢。”
prim 算法对应于dijstra算法。dijistra算法也可以用堆进行优化。
STL中heap函数
参考这个例子中,注意push_heap 和 pop_heap只是改变vector中元素位置,并不会插入或删除元素,所以要配合vector.push_back() 和 vector.pop_back()使用!
// range heap example
#include <iostream> // std::cout
#include <algorithm> // std::make_heap, std::pop_heap, std::push_heap, std::sort_heap
#include <vector> // std::vector
int main () {
int myints[] = {
10,20,30,5,15};
std::vector<