最小生成树算法[Prime/(Kruskal)]

构造联通网最小代价生成树称为最小生成树。

Prime算法。

由点到边~

输入二维n*n矩阵,代表相应两点之间权重大小。我们的目标是选出连通所有点的权重和最小的一条路。

思路:以第一个点为起点,选择它连接的所有点中权重最小的连接点,被选中的点成为第一次连通第一个点的点,之后更新adjvex[]数组,选中点相应下标对应数据设为0。之后以选中的点为下一次数据的参考行,更新保存相关顶点边的权重的数组lowcost[],再在该数组中选中权重最小值,保存位置,更新相应位置的adjvex数组,依次进行,付代码如下。

#include <iostream>
using namespace std;

void main()
{
	int n;
	cout << "请输入部落个数n" << endl;
	cin >> n;
	cout << "请输入n行n列的距离矩阵" << endl;
	int a[10][10];
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cin >> a[i][j];
		}
	}
	int min,j, k;
	int sum = 0;
	int adjvex[10];
	int lowcost[10];
	lowcost[0] = 0;
	adjvex[0] = 0;
	for (int i = 1; i < n; i++)
	{
		lowcost[i] = a[0][i];
		adjvex[i] = 0;
	}
	for (int i = 1; i < n; i++)
	{
		min = 65535;
		j = 1;
		k = 0;
		while (j < n)
		{
			if (lowcost[j] != 0 && lowcost[j] < min)
			{
				min = lowcost[j];
				k = j;
			}
			j++;
		}
		sum += min;
		lowcost[k] = 0;
		for (j = 1; j < n; j++)
		{
			if (lowcost[j] != 0 && a[k][j] < lowcost[j])
			{
				lowcost[j] = a[k][j];
				adjvex[j] = k;
			}
		}
	}
	cout << sum << endl;
}
以上输出为最小权重和。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值