这个prim-最小生成树的原理在于当有N个点要遍历时通过N-1次循环,每一次循环必须在横坐标未被标记且纵坐标已被标记的情况下来进行循环,其意义在于从剩下的未别标记的点里面找到与已被标记的点之间的最小的权值,每次循环找到一个,循环N-1次自然也就得到了最小生成树了:
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<cstring>
using namespace std;
int map[20][20],road[20],flag[20]={0};
int f=1;
void solve(int n){
int min,ok;
min=10000;
for(int i=1;i<=n;i++){
if(flag[i]==0){
for(int j=1;j<=n;j++){
if(flag[j]==1){
if(map[i][j]<min && map[i][j]!=0){
min=map[i][j];
ok=i;
}
}
}
}
}
road[f]=min;
f++;
flag[ok]=1;
}
int main(){
int n,su=0;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>map[i][j];
}
}
flag[1]=1;
for(int p=1;p<n;p++){
solve(n);
}
cout<<"经过的每一段路径长度为:"<<endl;
for(int i=1;i<n;i++){
cout<<road[i]<<" ";
su+=road[i];
}
cout<<endl<<"最短路径总长为:"<<su<<endl;
}