最小生成树算法 Lazy Prim,对下面的有权图使用Lazy Prim算法求最小生成树
(1)首先将起始节点0作为切分的一部分,将其他的节点作为切分的另外一部分,这样就得到4个横切边,横切边中最小的那个为0-7,所以0-7这条横切边一定属于最小生成树,这里使用最小堆来找到最小边
(2)接下来可以将节点7也表示为红色,这样与7连接的又多了4个横切边,那么所有的7条横切边中最小的那个是1-7,该条边也属于最小生成树,
(3)接下来将1表示为红色,又可增加与节点1相连接的3条横切边,这样在所有的横切边中,最小的那条边是0-2,将2表为红色,又可增加4条横切边
(4)横切边中最小的那个是2-3,将3表为红色,又可增加2条横切边,接下来最小的横切边是5-7,将5标为红色,增加相应的横切边,接下来横切边中最小的是0.29的1-3这条边,但是1和3都已经是红色的节点,表示1-3已经不是横切边了,
(5)舍弃1-3这条边,同理舍弃2-7和1-5,接下来最小的横切边为4-5,4-5属于最小生成树,标红,
(6)以此类推,可将所有的节点都遍历完
程序实现如下
#include <iostream>
#include <iomanip>
#include "DenseGraph.h"
#include "SparseGraph.h"
#include "ReadGraph.h"
#include "LazyPrimMST.h"
using namespace std;
int main() {
string filename = "testG1.txt";
int V = 8;
SparseGraph<double> g = SparseGraph<double>(V, false);
ReadGraph<SparseGraph<double>, double> ReadGraph(g, filename);
//Test Lazy Prim MST
cout<<"Test Lazy Prim MST:"<<endl;
LazyPrimMST<SparseGraph<double>, double> lazyPrimMST(g);
vector< Edge<double> > mst = lazyPrimMST.mstEdges();
for (int i = 0; i < mst.size(); i ++)
cout<<mst[i]<<endl;
cout<<"The MST weight is: "