白话Prim

需要有一个保存节点到当前集合的最短距离的数组,不连通的为max

在搜索的循环内

1.循环所有点,找出与当前集合距离最短的点,设置当前点为该点,设置该点访问过

2.循环所有点,将未访问过的点与当前最短距离和新点的最短距离比较,更新数组


代码:

int prim(int n)
{
	initialize(visit,false,n);
	int low[POINTNUM];//当前集合到各个顶点的距离的最短值
	int newpoint;//当前需要搜索的点,即集合新增的点 
	int sum=0;//最终结果
	int min;//临时最小值 
 
	newpoint=0;//当前点初始化为编号0 
	visit[0]=1;//0点已加入集合 
 
	for(int i=0;i<n;i++) 
	low[i]=map[newpoint][i];//将当前集合(0点)到其他所有点的权值赋值到low里面
 
	for(int i=1;i<n;i++)//开始搜索,总共需要搜索n-1次 
	{
		min=INT_MAX;
		for(int j=0;j<n;j++)//搜索与当前集合距离最短的点 
		{
			if(visit[j]==0 && min>low[j])//被搜索到的点还没在集合里,该点到当前集合的距离是存在的且足够短 
			{
				min=low[j];
				newpoint=j; 
			}
		}
		sum+=min;
		visit[newpoint]=1;
		for(int j=0;j<n;j++)//为集合新增的点添加满足条件的权值 
		if(visit[j]==0)
		{
			if(low[j]>map[newpoint][j]) low[j]=map[newpoint][j];
		}
	} 
	return sum;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值