最小生成树----Prim算法
2009-07-31 08:33
316 查看
最小生成树是数据结构中图的一种重要应用,它的要求是从一个带权无向完全图
中选择n-1条边并使这个图仍然连通(也即得到了一棵生成树),同时还要考虑使树的权最小。
以下代码包含生成无向网图,prim算法计算最小生成树的完整步骤。请观看【动画演示prim算法
】,验证程序是否正确。
代码说明几点:
lowcost[]用来保存集合V-U中各顶点与集合U中顶点最短边的权值,lowcost[v]=0表示顶点v已加入最小生成树中;
adjvex[]用来保存依附于该边在集合U中的顶点。
初始无向带权图如下:
实现的完整代码如下:
程序测试结果如下:
中选择n-1条边并使这个图仍然连通(也即得到了一棵生成树),同时还要考虑使树的权最小。
以下代码包含生成无向网图,prim算法计算最小生成树的完整步骤。请观看【动画演示prim算法
】,验证程序是否正确。
代码说明几点:
lowcost[]用来保存集合V-U中各顶点与集合U中顶点最短边的权值,lowcost[v]=0表示顶点v已加入最小生成树中;
adjvex[]用来保存依附于该边在集合U中的顶点。
初始无向带权图如下:
实现的完整代码如下:
#include <iostream> using namespace std; #define MaxVertexNum 100 //最大的顶点数 #define INF 32767 //将无法到达的权值无限大设为32767 typedef char VertexType; typedef int EdgeType; typedef struct { VertexType vertex[MaxVertexNum]; //顶点表 EdgeType edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,可看做边表 int n,e; //图中当前的顶点数和边数 }MGraph; void CreateMGraph(MGraph &G) { int i,j,k,m; cout<<"请输入顶点数和边数:"; cin>>G.n>>G.e; cout<<"请输入顶点元素:"; for (i=0;i<G.n;i++) { cin>>G.vertex[i]; } for (i=0;i<G.n;i++) { for (j=0;j<G.n;j++) { G.edges[i][j]=INF; //初始化无限大权值 if (i==j) { G.edges[i][j]=0; //对角线为0 } } } // 无向网图的建立 cout<<"请输入边两端顶点序号和相应的权值:/n"; for (k=0;k<G.e;k++) { cin>>i>>j>>m; G.edges[i][j]=m; G.edges[j][i]=m; } } int MinEdge(int lowcost[],int n) { int i,k,min=INF; for (i=0;i<n;i++) { if (lowcost[i]<min && lowcost[i]!=0) { min=lowcost[i]; k=i; } } return k; } void prim(MGraph G,int lowcost[],char adjvex[]) { int i,j,k; for(i=1;i<G.n;i++) //初始化两个辅助数组 { lowcost[i]=G.edges[0][i]; adjvex[i]=0; } lowcost[0]=0; //将顶点0加入集合U中 for (i=1;i<G.n;i++) { k=MinEdge(lowcost,G.n); cout<<"( "<<(char)(adjvex[k]+'0')<<"--->"<<(char)(k+'0')<<" ) "<<lowcost[k]<<endl; lowcost[k]=0; for (j=0;j<G.n;j++) //跟书上的不一样,这里j要从0开始,调整数组lowcost和adjvex { if (G.edges[k][j]<lowcost[j] && G.edges[k][j]!=0) { lowcost[j]=G.edges[k][j]; adjvex[j]=k; } } } } int main() { MGraph G; int lowcost[25]; char adjvex[25]; memset(lowcost,0,sizeof(lowcost)); memset(adjvex,'/0',sizeof(adjvex)); CreateMGraph(G); prim(G,lowcost,adjvex); return 0; }
程序测试结果如下:
相关文章推荐
- 最小生成树Prim算法朴素版 C语言实现
- 最小生成树Prim算法(邻接矩阵和邻接表)
- J - Borg Maze——bfs+最小生成树_Prim算法
- prim算法解决最小生成树问题
- 最小生成树之Prim算法
- Prim算法求最小生成树
- 最小生成树-Prim算法和Kruskal算法
- Desert King(01分数规划+最小生成树prim算法)
- poj3026Borg Maze_最小生成树(广搜+prim算法)
- 最小生成树(Prim算法)
- 求最小生成树的Prim算法
- 4---------最小生成树--prim算法
- HDU1162-Eddy's picture-最小生成树(prim算法模板)
- 最小生成树——Prim算法
- 最小生成树——Prim算法
- 最小生成树——Prim算法
- 求最小生成树的prim算法
- 数据结构--图--最小生成树(Prim算法)
- c++版本的prim算法最小生成树
- HDU-1233 还是畅通工程(最小生成树Prim算法)