最小生成树prim算法的思路
总共从n个点中找到n-1条最短路径,所以总循环n-1次{
进行n次循环,目的:遍历从起始点到达各个未访问点的距离,取一个最短的
把这个最短的路径加到总路径中
再进行循环:新增的节点到达某一个未访问点比从源点更近的话,更新源点到此点的距离
(dis数组刚开始用于存放源点到达各点的距离,随后更新后表示的是整个网到达各点的距离)
注意:要有一个数组标记节点访问情况,如果一个节点被标记了就不能再访问它,否则就会形成一个环,
一个环必有一个多余的边。
#include<stdio.h>
#define maxnum 50
#define inf 999999
typedef struct MGraph{
int vex[maxnum][maxnum];//邻接矩阵
int mark[maxnum];//标记各个点的访问情况
int dis[maxnum];//记录树到达各点的距离
int num;//记录节点的总数
}MGraph;
void Create(MGraph *G){
scanf("%d",&G->num);
for(int i=0;i<G->num;i++){
for(int j=0;j<G->num;j++){
scanf("%d",&G->vex[i][j]);
if(i!=j&&G->vex[i][j]==0)
G->vex[i][j]=inf;
}
}
for(int i=0;i<G->num;i++){
G->dis[i]=G->vex[0][i];
G->mark[i]=0;
}
G->dis[0]=0;
G->mark[0]=1;
}
void prim(MGraph *G){
int min,i,j,k,sum=0,n;
for(i=0;i<G->num-1;i++){
min=inf;
for(j=0;j<G->num;j++){
if(G->dis[j]<min&&G->mark[j]==0){
min=G->dis[j];
n=j;
}
}
sum+=G->dis[n];
G->mark[n]=1;
for(k=0;k<G->num;k++){//松弛环节
if(G->dis[k]>G->vex[n][k]&&G->mark[k]==0)
G->dis[k]=G->vex[n][k];
}
}
printf("%d",sum);
}
int main(){
MGraph G;
Create(&G);
prim(&G);
}