prim最小生成树 C++实现

prim最小生成树

#define MaxSize 1000
#define INT_MAX 0x7fffffff

typedef struct
{
	// 邻接矩阵
	int edges[MaxSize][MaxSize];
	// 图中顶点个数
	int n;
}Graph;


// 时间复杂度为O(n2),与图的边数无关,适合稠密图
void prim(Graph g, int v)
{
	// 存储出发顶点到其他顶点的权值
	int lowcost[MaxSize];
	// 中间变量,用于寻找最小值
	int min;
	// 存储最小值的终点下标序号,随着循环不断更新
	int closest[MaxSize];
	int i, j, k;

	// 初始化lowcost和closest
	for(i = 0; i < g.n; i++)
	{
		// 给权值付邻接矩阵的初值
		lowcost[i] = g.edges[v][i];
		// 所有节点都为出发节点v
		closest[i] = v;
	}

	// 循环剩余n-1个节点
	for(i = 1; i < g.n; i++)
	{
		min = INT_MAX;
		for(j = 0; j < g.n; j++)
		{
			// 找最小值
			if(lowcost[j] != 0 && lowcost[j] < min)
			{
				min = lowcost[i];
				// 记录最近顶点的下标
				k = j;
			}
		}
		// 打印从出发点到最小值点的权值和顺序
		printf("%d, %d, %d", closest[k], k, min);
		// 标记k为出发点,进行下一次循环准备
		lowcost[k] = 0;

		for(j = 0; j < g.n; j++)
		{
			// 若大于lowcost[j] 则不修改
			if(g.edges[k][j] != 0 && g.edges[k][j] < lowcost[j])
			{
				// 此时更新为k到j的权值,因为该权值最小
				lowcost[j] = g.edges[k][j];
				closest[j] = k;
			}
		}
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值