最小生成树之Prim算法C++实现
2015-04-16 14:38
549 查看
Prim算法的基本思路:
将图中的所有的顶点分为两类:树顶点(已经被选入生成树的顶点)和非树顶点(还未被选入生成树的顶点)。首先选择任意一个顶点加入生成树,接下来要找出一条边添加到生成树,这需要枚举每一个树顶点到每一个非树顶点所有的边,然后找到最短边加入到生成树。依次,重复操作n-1次,直到将所有顶点都加入生成树中。
输出结果
将图中的所有的顶点分为两类:树顶点(已经被选入生成树的顶点)和非树顶点(还未被选入生成树的顶点)。首先选择任意一个顶点加入生成树,接下来要找出一条边添加到生成树,这需要枚举每一个树顶点到每一个非树顶点所有的边,然后找到最短边加入到生成树。依次,重复操作n-1次,直到将所有顶点都加入生成树中。
#include<iostream> using namespace std; int main() { int points,edges,min; int edge[7][7]; int dis[7]; int flag[7]={0}; int infinity=99999999; cin>>points>>edges; for (int i=1;i<=points;i++) { for (int j=1;j<=points;j++) { if (i==j) { edge[i][j]=0; } else { edge[i][j]=infinity; } } } int p1,p2,w; for (i=1;i<=edges;i++) { cin>>p1>>p2>>w; edge[p1][p2]=w; edge[p2][p1]=w; } for (i=1;i<=points;i++)//初始化1号顶点到其它顶点的距离 { dis[i]=edge[1][i]; } flag[1]=1; int count=1; int j; int sum=0; while (count<points) { min=infinity; for (i=1;i<=points;i++) { if (flag[i]==0&&dis[i]<min)//每次选择1号顶点到其它顶点的最短距离加入生成树 { min=dis[i]; j=i; } } flag[j]=1; count++; sum+=dis[j]; for (i=1;i<=points;i++)//选择出的顶点再延伸更新1号顶点到其它顶点的距离 { if (flag[i]==0&&dis[i]>edge[j][i]) { dis[i]=edge[j][i];//如果满足条件则更新 } } } cout<<sum<<endl; }
输出结果
相关文章推荐
- 【算法和数据结构】图(二)最小生成树之Prim算法(C++实现)
- 我对Prim算法用于求无向图的最小生成树的理解 (C++实现)
- 最小生成树之Prim算法的实现
- c++ 最小生成树之prim算法
- 数据结构(C实现)------- 最小生成树之Prim算法
- hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)
- 最小生成树 prim算法 C++实现
- 最小生成树(prim算法,Kruskal算法)c++实现
- 数据结构(C实现)------- 最小生成树之Prim算法
- 最小生成树之Kruskal和Prim算法——C++实现
- 最小生成树之Prim算法实现
- c++中关于图的最小生成树的Prim算法的实现
- 最小生成树Prim算法实现(采用邻接表存储)C++实现
- hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)
- 数据结构之图---最小生成树Prim算法---C++实现
- 最小生成树之prim算法概念与实现
- Prim算法最小生成树c++实现
- 最小生成树Prim算法实现(采用邻接表存储)C++实现
- 图论算法:最小生成树——Prim算法和Kruskal算法C++实现
- Prim算法求最小生成树的c++代码实现