Prime算法 c实现 & 边的归并记录数组

#define INFINITY  2020;

typedef struct closedge //保存链接边的辅助的类型
{
 int adjvex;
 int lowcost; /*✿✿✿✿生成树到adjvex的距离为lowcost✿✿✿✿,当值为0时表示已经归并到了树中*/
} closedge;

int Prime()//图的最小生成树算法
{  

	int arr[8][8] = {{2020, 8, 2020, 4, 2020},  
					 {8, 2020, 7, 5, 12},  
					 {2020, 7, 2020, 11, 6},  
					 {4, 5, 11, 2020, 3},  
					 {2020, 12, 6, 3, 2020},  
					} ;

	 int u=1;/*从❤第二个❤顶点开始构造图的最小生成树*/
	 closedge closedge[5];
	 int  j,k,v,min;

	 for(j=0;j<5;j++)/*生成树与其他节点的最小距离数组初始化,其中5是顶点的个数*/
	 { closedge[j].adjvex=u;
	 closedge[j].lowcost=arr[u][j];/*初始化arr[1][j]*//*初始化({8, 2020, 7, 5, 12},)*/
	 }
	 closedge[u].lowcost=0;/*初始点,并入最小生成树*/
	 printf("%d->",u);
	
	 for(j=0;j<5-1;j++)/*5是顶点的个数,只需再运行四次,取四次树与节点的最小值,并入其他的四个点*/
	 {
	    min=2020;  
	 for(v=0;v<5;v++)/*关键:寻找最短的点*/
		 if(closedge[v].lowcost!=0 && closedge[v].lowcost<min)/*如果v点没有并入树,寻找距离最短的k点*/
		 {
		    min=closedge[v].lowcost;     k=v;
	     }
	 
		 closedge[k].lowcost=0;/*将顶点k并入U中*/
		 printf("%d->",k);

		 /*❤ k并入后,更新最短距离,修改closedge【n】中的各个元素的值 ❤ */
		 for(v=0;v<5;v++)
			 if(arr[v][k]<closedge[v].lowcost)
		     {
				 closedge[v].lowcost=arr[v][k];
				 closedge[v].adjvex=k;
			 }

      }
	
	printf("prime算法执行结束,以上为选择到当前树最近的顶点的序列\n");
	return 0;

}



 int main()
 {
	 Prime();printf("按任意键继续");int aaahhh=0;scanf("%d",&aaahhh); //防止运行完一闪而过return 0;
 }

#include<stdio.h>/*更详细的注释版*/
#include<string.h> 
#include<stdlib.h>
#define INFINITY  2020;

typedef struct closedge //保存链接边的辅助的类型
{
 int adjvex;
 int lowcost; /*✿✿✿✿生成树到adjvex的距离为lowcost✿✿✿✿,当值为0时表示已经归并到了树中*/
} closedge;
/*当不需要保存邻接边时,如只计算最小代价,可仅使用数组 int lowcost[];*//*也有算法多用了一个vset[]保存是否并入生成树,实际上用lowcost[]==0也能进行判断*/
int Prime()//图的最小生成树算法
{  

	int arr[8][8] = {{2020, 8, 2020, 4, 2020},  
					 {8, 2020, 7, 5, 12},  
					 {2020, 7, 2020, 11, 6},  
					 {4, 5, 11, 2020, 3},  
					 {2020, 12, 6, 3, 2020},  
					} ;

	 int u=1;/*从❤第二个❤顶点开始构造图的最小生成树*/
	 closedge closedge[5];
	 int  j,k,v,min;

	 for(j=0;j<5;j++)/*5是顶点的个数,生成树与其他节点的最小距离数组初始化*/
	 { closedge[j].adjvex=u;
	 closedge[j].lowcost=arr[u][j];/*初始化arr[1][j]*//*初始化({8, 2020, 7, 5, 12},)*/
	 }
	 closedge[u].lowcost=0;/*初始点,并入最小生成树*/
	 printf("%d",u);
	
	 for(j=0;j<5-1;j++)/*5是顶点的个数,只需再运行四次,取四次树与节点的最小值,并入其他的四个点*/
	 {
	    min=2020;  
	 for(v=0;v<5;v++)
		 if(closedge[v].lowcost!=0 && closedge[v].lowcost<min)/*如果v点没有并入树,寻找距离最短的k点*/
		 {
		    min=closedge[v].lowcost;     k=v;
	     }
	 
		 closedge[k].lowcost=0;/*将顶点k并入U中*/
		 printf("%d",k);

		 /*❤ k并入后,更新最短距离,修改closedge【n】中的各个元素的值 ❤ */
		 for(v=0;v<5;v++)
			 if(arr[v][k]<closedge[v].lowcost)
		     {
				 closedge[v].lowcost=arr[v][k];
				 closedge[v].adjvex=k;
			 }

      }
	
	printf("prime算法执行结束");
	return 0;

}

 int main()
 {
	 Prime();printf("*******"); int aaahhh=0;scanf("%d",&aaahhh); /*防止运行完一闪而过*/return 0;
 }

运行结果:
在这里插入图片描述
菜鸟教程在线编辑器

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值