template<class EdgeType>
Edge<EdgeType> *AdjGraph<EdgeType>::Prim(int s)//应用Prim算法从s顶点出发得到的最小生成树
{
int i,j;
Edge<EdgeType> *MST;//存储最小生成树的边,即各个顶点到生成树中的各个顶点的最短的边
int *neighbor;//neighbor[i]表示生成树的点中与i点最近的点编号,-1表示i点已经在生成树中
EdgeType *nearest;//nearest[i]表示生成树中的点到i点的最小边权值
int n=vertexNum;//图的顶点个数
neighbor=new int[n];
nearest=new EdgeType[n];
MST=new Edge<EdgeType>[n-1];
for(i=0;i<n;i++)//初始化neighbor数组和neighbor数组
{
neighbor[i]=s;
nearest[i]=1000;
}
for(Edge<EdgeType> e=firstEdge(s);isEdge(e);e=nextEdge(e))//给生成树外所有以s为始点形成边的点赋连接两点的边的权值
{
nearest[e.end]=e.weight;
}
neighbor[s]=-1;
for(i=0;i<n;i++)//i标记已经加入到生成树中的点个数
{
EdgeType min=1000;
int v=-1;
for(j=0;j<n;j++)//确定一个点在生成树而另一个点j在生成树外并且两点形成的权值最小的边所关联的点
{
if(neighbor[j]!=-1 && nearest[j]<min)//j点在生成树外,并且j点与生成树中的点距离最近的距离小于最小距离
{
min=nearest[j];
v=j;
}
}//for(j)
if(v!=-1)
{
Edge<EdgeType> tempEdge(neighbor[v],v,nearest[v]);//neighbor[v]是生成树中的点,v是生成树外的点,nearest是这条边的权值
MST[i]=tempEdge;//将边加入到生成树集合中
neighbor[v]=-1;//将点v加入到生成树中
for(Edge<EdgeType> e=firstEdge(v);isEdge(e);e=nextEdge(e))
{
int u=e.end;
if(neighbor[u]!=-1 && nearest[u]>e.weight)//用与顶点v关联的边,更新生成树之外的点u,到生成树集合的最小值边
{
neighbor[u]=v;
nearest[u]=e.weight;
}
}//for(e)
}//if(v!=-1)
}//for(i)
delete []neighbor;
delete []nearest;
return MST;
}
Edge<EdgeType> *AdjGraph<EdgeType>::Prim(int s)//应用Prim算法从s顶点出发得到的最小生成树
{
int i,j;
Edge<EdgeType> *MST;//存储最小生成树的边,即各个顶点到生成树中的各个顶点的最短的边
int *neighbor;//neighbor[i]表示生成树的点中与i点最近的点编号,-1表示i点已经在生成树中
EdgeType *nearest;//nearest[i]表示生成树中的点到i点的最小边权值
int n=vertexNum;//图的顶点个数
neighbor=new int[n];
nearest=new EdgeType[n];
MST=new Edge<EdgeType>[n-1];
for(i=0;i<n;i++)//初始化neighbor数组和neighbor数组
{
neighbor[i]=s;
nearest[i]=1000;
}
for(Edge<EdgeType> e=firstEdge(s);isEdge(e);e=nextEdge(e))//给生成树外所有以s为始点形成边的点赋连接两点的边的权值
{
nearest[e.end]=e.weight;
}
neighbor[s]=-1;
for(i=0;i<n;i++)//i标记已经加入到生成树中的点个数
{
EdgeType min=1000;
int v=-1;
for(j=0;j<n;j++)//确定一个点在生成树而另一个点j在生成树外并且两点形成的权值最小的边所关联的点
{
if(neighbor[j]!=-1 && nearest[j]<min)//j点在生成树外,并且j点与生成树中的点距离最近的距离小于最小距离
{
min=nearest[j];
v=j;
}
}//for(j)
if(v!=-1)
{
Edge<EdgeType> tempEdge(neighbor[v],v,nearest[v]);//neighbor[v]是生成树中的点,v是生成树外的点,nearest是这条边的权值
MST[i]=tempEdge;//将边加入到生成树集合中
neighbor[v]=-1;//将点v加入到生成树中
for(Edge<EdgeType> e=firstEdge(v);isEdge(e);e=nextEdge(e))
{
int u=e.end;
if(neighbor[u]!=-1 && nearest[u]>e.weight)//用与顶点v关联的边,更新生成树之外的点u,到生成树集合的最小值边
{
neighbor[u]=v;
nearest[u]=e.weight;
}
}//for(e)
}//if(v!=-1)
}//for(i)
delete []neighbor;
delete []nearest;
return MST;
}