Prim算法的核心在于通过book数组记录已经在生成树上的节点,并不断寻找树外最小边加入到生成树中(贪心的策略)
在每次更新生成树后,还必须用更新dis数组
dis数组的含义必须要明确,dis函数代表的是生成树上的所有节点到树外的各节点的权值的最小值,而不是单单树内的一个节点
以下是代码的实现
#include"iostream"
#include"cstdio"
#define inf 99999999
using namespace std;
int dis[100];
int map[100][100];
int book[100];
int n,m;
int sum=0;
int count=0;
int t1,t2,t3;
int main()
{
int mink;
int point;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
{
map[i][j]=0;
}
else
{
map[i][j]=inf;
}
}
}
for(int i=1;i<=m;i++)
{
cin>>t1>>t2>>t3;
map[t1][t2]=t3;
map[t2][t1]=t3;
}
for(int i=1;i<=n;i++)
{
dis[i]=map[1][i];
}
book[1]=1;
count++;
while(count<n) //一旦生成树上有n个节点那么最小生成树建立完毕
{
mink=inf;
point=1;
for(int i=1;i<=n;i++)
{
if(book[i]==0&&dis[i]<mink)
{
mink=dis[i];
point=i;
}
} //找到最小的权值的边
book[point]=1; //小心记住一定要将记录修改
count++;
sum+=dis[point];
for(int i=1;i<=n;i++) //更新dis数组的距离
{
if(book[i]==0&&dis[i]>map[point][i])
{
dis[i]=map[point][i];
}
}
}
cout<<sum<<endl;
return 0;
}
因为不需要过多的模板函数,Prim算法看上去确实比Krustral算法好实现一点