您的位置:首页 > 编程语言 > C语言/C++

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

2015-04-16 14:38 549 查看
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;
}


输出结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: