最小生成树prim算法(C语言版)详细注释

prim算法就好像是一棵"生成树"在慢慢长大,从开始的一个顶点长到了n个顶点。
总结一下这个算法,将图中所有的顶点分为2类,树顶点(已被选入生成树的顶点)和非树顶点(还未被选入生成树的顶点),接下来要找出一条边添加到生成树,这需要枚举每一个树顶点到每一个非树顶点所有的边,然后最短边加入到生成树,重复操作n-1次,直到所有顶点加入到生成树中。

实现此算法时,比较了dijkstra最短路径算法,在记录的最短距离,不是每个顶点到1号顶点的距离,而是每个顶点到任意一个“树顶点”的最短距离,如果dis[k]>e[j][k],则更新dis[k]=e[j][k]。

 #include<stdio.h>
    int main(){
    	int n,m,i,j,k,min,t1,t2,t3;
    	int e[10][10],dis[10],book[10]={0};//初始化各个量
    	int inf=99999999;
    	int count=0,sum=0;      //count用来记录生成树中顶点的个数,sum用来储存路径之和
    	//n表示顶点个数,m表示边的条数
    	scanf("%d %d",&n,&m);
    	//初始化
    	for(i=1;i<=n;i++)
    		for(j=1;j<=n;j++)
    			if(i==j) e[i][j]=0;
    			else e[i][j]=inf;
    	//开始读入边
    	for(i=1;i<=m;i++){
    		scanf("%d %d %d",&t1,&t2,&t3);
    	    e[t1][t2]=t3;
    	    e[t2][t3]=t3;//无向图,需要将边再反写储存一遍。
    	}
    	for(i=1;i<=n;i++)
    		dis[i]=e[1][i];	//dis[4]中存储的就是2到4这条边的权值
    	book[1]=1;//这里用book标记判断是否加入生成树
    	//prim核心部分开始。
    	//将1号顶点加入生成树。
    	count++;
    	while(count<n){
    		min=inf;
    		for(i=1;i<=n;i++)
    		{
    			if(book[i]==0&&dis[i]<min){
    				min=dis[i];
    				j=i;
    			}
    		}
    		book[j]=1;count++;sum=sum+dis[j];
    		//扫描当前顶点j的所有的边,再以j为中间点,更新生成树到每一个非树顶点的距离
    		for(k=1;k<=n;k++){
    			if(book[k]==0&&dis[k]>e[j][k])
    				dis[k]=e[j][k];
    		}
    	}
    	printf("%d",sum);
    	getchar();       //getchar()暂停程序,查看输出。
    	getchar();
    	return 0;
    }				

代码运行结果如下:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值