Prim算法,每次总是将下一条连接树中的顶点与不在树中的顶点且权重最小的边加入树中。
Prim算法能够得到任意加权连通图的最小生成树。
数据结构:
顶点:使用一个布尔数组marked来表示顶点是否在最小生成树中
边:一条队列mst来保存最小生成树的边
横切边:用优先队列pq<Edge>来根据权重比较所有的边
重点:每当我们向最小生成树中添加了一条边之后,也向树中添加了一个顶点。要维护一个包含所有横切边的集合,就要将连接这个顶点和其他所有不在树中的顶点的边加入队列(用marked来识别这样的边)。但还有一点:连接新加入树中的顶点与其他已经在树中顶点的所有边都失效了。
Prim算法的即时实现可以将这样的边从优先队列中删掉
Prim算法的延时实现将这些边先留在优先队列中,等到要删除他们的时候再检查边的有效性
-LazyPrimMST.h 最小生成树的Prim算法的延时实现
#ifndef __LAZY_PRIM_MST_H__
#define __LAZY_PRIM_MST_H__
#include <queue>
#include <functional>
#include "EdgeWeightedGraph.h"
#include "Edge.h"
/**
* Prim算法的延时删除实现
* 延时删除:新加入树中的顶点与其他已经在树中的顶点的边不立即删除,
* 将这些边先留在优先队列中,等到要删除他们的时候再检查边的有效性
*/
class LazyPrimMST {
private:
bool* marked; // 最小生成树的顶点
std::queue<Edge> mst; // 最