数据结构–图的最小生成树Prim算法
//5.21编程集训——2.最小生成树Prim算法;
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#define MAX_SIZE 10
#define MAX 1000//用这个数来表示无穷大
using namespace std;
//根据观察发现,这个算法应该使用邻接矩阵
struct QGraph{//邻接矩阵的结构表示
int matrix[MAX_SIZE][MAX_SIZE];
int n,e;
};
void Init(QGraph *Q){//初始化邻接矩阵
for(int i=0;i<Q->n;i++){
for(int j=0;j<Q->n;j++){
Q->matrix[i][j]=MAX;
}
}
}
void Creat(QGraph *Q){
int a,b,num;//表示两个节点以及两个节点之间的长度
cout<<"请输入顶点数以及边数:"<<endl;
cin>>Q->n>>Q->e;
cout <<"请输入节点以及节点之间的距离:"<<endl;
for(int i=1;i<=Q->e;i++){
cin>>a>>b>>num;
Q->matrix[a][b]=num;
Q->matrix[b][a]=num;
}
}
void Prim(QGraph *Q,int v,int &sum){//求解最小生成树包括路径的和
int distance[MAX_SIZE];//表示其余所有顶点到已经生成的树的最小距离
int sorted[MAX_SIZE];//表示是否已经加入到最小生成树里面
int mindis;//最小数值
for(int i=0;i<Q->n;i++){
sorted[i]=0;//初始化表示都没有被访问过
}
sorted[v]=1;
for( int j=0;j<Q->n;j++){
distance[j]=Q->matrix[v][j];
}//初始化第一个选中的元素到各条边的距离
int t;
for( int k=1;k<Q->n;k++){//k之所以可以从1开始
mindis=100;
for( int m=0;m<Q->n;m++){
if((sorted[m]==0)&&(distance[m]<mindis)){
mindis=distance[m];
t=m;
}
}
sum=sum+mindis;//逐步累积的和
cout<<sum<<endl;
sorted[t]=1;
for( int p=0;p<Q->n;p++){
if((sorted[p]==0)&&(Q->matrix[t][p]<distance[p]))
distance[p]=Q->matrix[t][p];
}
}
cout<<sum<<endl;
/*for( int q=0;q<Q->n;q++){
if(sorted[q]==1)
cout<<q<<endl;
} //输出构成最小生成树的各个元素 */
}
int main(){
QGraph Q;
int sum=0;
cout<<"请输入一个数作为开始的节点:"<<endl;
int v;
cin>>v;
Init(&Q);
Creat(&Q);
Prim(&Q,v,sum);
return 0;
}
调试结果如图所示:
这个算法有一个小细节需要注意:
主体for循环的循环次数不是节点的个数,而是节点的个数-1;
如下图所示: