Prim算法
来源:互联网 发布:苗立杰wnba数据 编辑:程序博客网 时间:2024/05/17 07:58
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;
}
- prim 算法
- Prim算法
- Prim算法
- prim算法
- Prim算法
- Prim算法。
- Prim 算法
- Prim算法
- prim算法
- Prim算法
- Prim算法
- Prim算法
- prim算法
- prim算法
- Prim算法
- Prim算法
- prim算法
- prim算法
- Struts2常用标签总结
- 2012年12月17日 - 2013年2月1日规划
- 2012年12月16日 我人生第一篇论文正式被通知录取
- Struts2 标签库讲解
- Linux常用命令
- Prim算法
- 创建临时文件
- struts
- 【2012级新生请猛击】NEW COMER FIRST BLOOD 完全题解及代码
- 存储过程在数据库中的作用是什么
- 栈帧&溢出
- NEFU要崛起——第8场
- OpenGL织梦之旅【第三章】第2节.循环显示图片
- gopherlib.py