code1078 最小生成树(Prim算法/普里姆算法)

时间:2021-09-08 11:39:49

最小生成树有两种算法,Prim算法和Kruskal算法。

Prim算法

^1是从任意选取的一个点出发,将该点放到数组vex中,然后将这个点到其他点(1到n)的距离存放到数组tem中,再选取距离最短(权值最小)的边,并将该边所连接到的点放入vex中。

^2把该点到其他点(除了vex中的点以外的&&1 到n的n个点)的距离与tem中存储的到每个点的距离相比,更新到每个点的最短距离,然后再选取距离最短(权值最小)的边,并将该边所连接到的点放入vex中

重复以上步骤^,直到vex中存储了n个点(找到了n-1条边)为止。

#include <iostream>
using namespace std;
int main()
{
int n;
int minn=999999,sum=0;
int shu[103][103];
int vex[103]={0};//直接数组赋值int vex[103]={1};并不会成功,数组整体赋值只能赋值为0,所以后面用!vex[j]的形式
int tem[103];
for(int g=0;g<103;g++){
tem[g]=9999999;//直接数组赋值int tem[103]={999999};并不会成功,数组整体赋值只能赋值为0。
}
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>shu[i][j];
}
}
int k=0;
for(int i=1;i<n;i++){
for(int j=1;j<n;j++){
if(!vex[j]&&shu[k][j]<tem[j])
tem[j]=shu[k][j];
}
for(int l=1;l<n;l++){
if(!vex[l]&&tem[l]<minn)
{
minn=tem[l];k=l;
}
}
vex[k]=1;
sum+=minn;
minn=999999;//及时重新赋值,或者将int minn放到往上第二个for里面第一句
}
cout<<sum<<endl;
}