用邻接矩阵来prim普利姆算法详解 c语言 数据结构 简单易懂 超详细~~

#include<stdio.h>
#include<stdlib.h>
#define INFINITY 65535
#define maxsize 100
typedef struct pragh
{
int numnode, vertexnode;//顶点数,边表数
int vex[maxsize];//存放顶点的数组
int arc[maxsize][maxsize];//存放边表信息的数组
}pragh;
void init(pragh* G)
{
int w;//存放权值
printf(“请输入顶点数和边表数\n”);
scanf_s("%d%d", &G->numnode, &G->vertexnode);
printf(“请分别输入顶点\n”);
for (int i = 0; i < G->numnode; i++)
{
scanf_s("%d", &G->vex[i]);
}
for (int i = 0; i < G->numnode; i++)
{
for (int j = 0; j < G->numnode; j++)
{
G->arc[i][j] = INFINITY;
}
}
for (int i = 0; i < G->vertexnode; i++)
{
for (int j = 0; j < G->vertexnode; j++)
{
printf(“请输入(i,j)边的下标i,j和权重w”);
scanf_s("%d%d%d", &i, &j, &w);
G->arc[i][j] = w;
G->arc[j][i] = G->arc[i][j];
}
}
printf(“图的初始化工作完毕\n”);
}
void createprimtree(pragh G)
{
int min;//存放找到的最近的权重值
int k;//存放距离最小的顶点的下标
int m;
int adjvex[maxsize];//存放顶点的下标
int lowcost[maxsize];//存放权重
lowcost[0] = 0;//随机加入一个顶点到prim生成树中,一般是下标为0的顶点
adjvex[0] = 0;//生成树中只有一个顶点,只有自己自己的距离最小
for (int j=1;j<G.numnode;j++)
{
lowcost[j] = 1;//先初始化除了顶点为0的顶点的lowcost为1,
//等于1表示除了第一个结点
//即顶点的下标为0的顶点加入到生成树中,其余都没有加入到该prim生成树中
//该值可以作为是否加入到生成树的一个标志
}
//接下来开始寻找剩余还没有加入到生成树的结点中谁到刚刚加入到生成树的结点的距离最小的
//那个结点的下标以及该下标所对应的权重
for (int i = 1; i < G.numnode; i++)
{
min = INFINITY;//可以先赋值为这个,之后可以通过和剩余的结点的权重进行
//比较,如果找到了一个权重更小的,那么min就为该权重较小值
for (int j = 0; j < G.numnode; j++)//寻找与i这个顶点距离最小的顶点
{
if (lowcost[j] < min && lowcost[j] != 0)
{//如果在剩余还没有加入到生成树的结点中找到了距离已经加入到生成树结点的更小值
min = lowcost[j];
k = j;
}
}
//这个时候已经找到了距离i顶点距离最小的顶点的下标k,及其权重min
//现在就将这个顶点加入到prim树中,注意最后还要将lowcost数组的值置为0
//表示已经加入到生成树中了
adjvex[i] = k;//表示距离顶点i的距离最小的顶点的下标为k
lowcost[i] = min;//并且距离最小的顶点的权重为刚刚找到的min

	//注意每一次有顶点加入到prim生成树中去,那么下一次再以据原先
	//该顶点没有加入到生成树中来算,就会发生错误,因为可能会有更近的
	//顶点到原先已经加入到prim生成树中的那些顶点的距离更近

	//所以应该让剩余的顶点到对prim生成树的顶点的距离进行更新
	//由于原先的距离是没有变化的,所以我们只用更新刚刚加入prim生成树中
	//的那个结点到剩余没有加入到生成树的顶点的权值

	for (m = 0; m < G.numnode; m++)
	{
		if (lowcost[m] < G.arc[k][m] && lowcost[m] != 0)
		{
			//G.arc[k][m]就表示G到各顶点之间的距离
			//由于对于顶点的下标进行了限制,即顶点的lowcost的值进行了限制
			//那么就相当于只对没有加入到生成树的结点的距离和原先的lowcost的值进行比较
			lowcost[m] = G.arc[k][m];
			adjvex[m] = k;
		}
	}
}
printf("生成树已经建立完毕\n");

}
int main(void)
{
pragh G;
init(&G);
createprimtree(G);
system(“pause”);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值