适用于边较为稠密型的连通网
假设N=(V,{VR})是一个连通网,TE是V上的最小生成树的边的集合,Prim算法从U={u0}(u0∈V) ,TE={}开始,重复执行下面的操作:
在所以的u∈U,v∈V-U的边(u,v)∈VR中找一条权值最小的边(u0,v0),并入集合TE,同时v0并入U,直至U=V为止。此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树。为了实现这个算法,需引入一个辅助的数组closedge,记录从U到V-U具有最小权值的边,每个顶点Vi对应数组中的closedege[i-1],包括两个域,一个是adjvex,存储该边依附的在U中顶点,另一个是Lowcost,存储权值。下面是代码:
tree.h文件
#include<iostream>
#include<string>
#include<queue>
using namespace std;
const int MAX_VEX_NUM=20;
bool visited[20];
class MGraph;
class CS_Tree;
//树结点
class CSnode
{
string data;
CSnode *firstchild;
CSnode *nextsibling;
friend class CS_Tree;
friend class MGraph;
};
//树类定义
class CS_Tree
{
public:
void PreRoot_Traverse(CSnode *T) //先根遍历
{
if(T)
{
cout<<T->data<<" ";
PreRoot_Traverse(T->firstchild);
PreRoot_Traverse(T->nextsibling);
}
}
void PostRoot_Traverse(CSnode *T) //后根遍历
{
if(T)
{
PostRoot_Traverse(T->firstchild);
cout<<T->data<<" ";
PostRoot_Traverse(T->nextsibling);
}
}
void LevelOrder_Traverse(CSnode *T) //层次遍历
{
queue<CSnode *> q;
CSnode *t;
q.push(T);
do
{
t=q.front();
do
{
cout<<t->data<<" ";
if(t->firstchild)
q.push(t->firstchild);
t=t->nextsibling;
}while(t);
q.pop();
}while(!q