最小生成树的定义
假定有一个连通无向图,其中是节点集合,表示节点间的边的集合,对于每条边,具有权重.这里希望找到一个无环子集,既能够将所有节点连接起来,又具有最小的权重和。我们就称之为一个最小生成树。
解决最小生成树问题的算法,常见的为Kruskal算法和Prim算法。如果使用普通的二叉堆,那么可以很容易地把这两个算法的时间复杂度限制在O(ElogV)数量级内。但是如果使用斐波那契堆,则Prim算法的运行时间将改善为O(E+logV),此运行时间在|V|远小于|E|的情况下较二叉堆有较大改进。
一、最小生成树的形成
假定有一个无向连通图和权重函数,若希望找出的一个最小生成树,先前所提及的两种算法都采取了贪心策略。
这个贪心策略可以用以下方式来描述。该方式在每个时刻生长最小生成树的一条边,并且在整个策略的实行过程中,做出如下保证:
在每遍循环前,A是某棵最小生成树的一个子集。
在每一步,我们要做的事就是选择一条边,让其加入到集合中,使得不违反循环不变式,即也是某棵最小生成树的子集。由于可以安全地将这种边加入到集合而不会破坏的循环不变