最小生成树之Prim算法C++实现

来源:互联网 发布:陈奕迅 蔡健雅 知乎 编辑:程序博客网 时间:2024/05/18 09:32
Prim算法的基本思路:

将图中的所有的顶点分为两类:树顶点(已经被选入生成树的顶点)和非树顶点(还未被选入生成树的顶点)。首先选择任意一个顶点加入生成树,接下来要找出一条边添加到生成树,这需要枚举每一个树顶点到每一个非树顶点所有的边,然后找到最短边加入到生成树。依次,重复操作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;}

输出结果


0 0
原创粉丝点击