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

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

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

 #include
    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(counte[j][k])
    				dis[k]=e[j][k];
    		}
    	}
    	printf("%d",sum);
    	getchar();       //getchar()暂停程序,查看输出。
    	getchar();
    	return 0;
    }				

代码运行结果如下:
最小生成树prim算法(C语言版)详细注释_第1张图片

你可能感兴趣的:(最小生成树prim算法(C语言版)详细注释)