C++,Prim普里姆算法求最小生成树

时间:2022-10-23 09:50:03

思想:蓝白点。未加入生成树的点标记为蓝点,加入生成树的点标记为白点。

每次循环找到当前离白点集团最近的蓝点,加入最小生成树(标记为白点)。

更新每个蓝点到白点集团的最小值。

 

C++,Prim普里姆算法求最小生成树C++,Prim普里姆算法求最小生成树
#include<iostream>
#include
<cstring>
using namespace std;

int main(){
int n,i,j;
int e[101][101];
int minn[101];
bool u[101];
int ans=0;

memset(minn,
0x7f,sizeof(minn));//将最小值设置为maxint
minn[1]=0;//这样设置是为了第一次循环把1加入生成树
memset(u,1,sizeof(u));//将所有点设置为蓝点(标记为未加入最小生成树)
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin
>>e[i][j];//构造邻接矩阵

int k;
for(i=1;i<=n;i++){
k
=0;
for(j=1;j<=n;j++)
if(u[j]&&minn[j]<minn[k])
{k
=j;}//找出当前离白点集团最近的蓝点

u[k]
=0;//将这个蓝点加入白点集团
for(j=1;j<=n;j++)
if(u[j]&&e[k][j]<minn[j]){
minn[j]
=e[k][j];//更新每个蓝点到白点集团的最小值
}
}

for(i=1;i<=n;i++){
ans
+=minn[i];
}
cout
<<ans;
return 0;
}
View Code