(C语言)最小生成树prim算法

最小生成树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);
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值