Prim算法的基本思路:
将图中的所有的顶点分为两类:树顶点(已经被选入生成树的顶点)和非树顶点(还未被选入生成树的顶点)。首先选择任意一个顶点加入生成树,接下来要找出一条边添加到生成树,这需要枚举每一个树顶点到每一个非树顶点所有的边,然后找到最短边加入到生成树。依次,重复操作n-1次,直到将所有顶点都加入生成树中。
C++实现:
#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;
}
//将顶点i的权值edge[1][i]存放在矩阵dis[i]中
for(i=1;i<=points;i++)
{
dis[i]=edge[1][i];
}
flag[1]=1;
int count=1;
int j;
int sum=0;
//主程序,循环遍历n-1次,直到将所有顶点都加入生成树中
while(count<points)
{
min=infinity;
for(i=1;i<=points;i++)
{
if(flag[i]==0&&dis[i]<min)
{
min=dis[i];
j=i;
}
}
flag[j]=1;
count++;
sum+=dis[j];
for(i=1;i<=points;i++)
{
if(flag[i]==0&&dis[i]>edge[j][i])
{
dis[i]=edge[j][i];
}
}
}
cout<<sum<<endl;
}