最小生成树---prime

1. prime算法

先找一个当前点加入 被访问点,
然后从 未被访问的点中找一个 距离被访问点团最近 的点, 加入


// alg_for_test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


#include <float.h> //FLT_MAX 

#include <stdlib.h>

#define  NUMOFDOT 6 //点的个数

void prim( float c[NUMOFDOT][NUMOFDOT]);

int main()
{
	float c[6][6] = {
		FLT_MAX, 6, 1, 5, FLT_MAX, FLT_MAX,
		6, FLT_MAX, 5, FLT_MAX, 3, FLT_MAX,
		1, 5, FLT_MAX, 5, 6, 4,
		5, FLT_MAX, 5, FLT_MAX, FLT_MAX, 2,
		FLT_MAX, 3, 6, FLT_MAX, FLT_MAX, 6,
		FLT_MAX, FLT_MAX, 4, 2, 6, FLT_MAX
	};

	prim(c);

	system("pause");

	return 0;
}

//n 表示定点个数, c[i][j]记录i点i到j的距离
void prim( float c[NUMOFDOT][NUMOFDOT])
{

	float lowcost[NUMOFDOT] = {0.0, }; //到点团的最短距离
	int closest[NUMOFDOT] = {0, }; //表示是通过哪个点得到的最短距离
	int s[NUMOFDOT] = {0, }; //标记数组,只有两种取值0 or 1. 0表示还未被访问过,1表示已经被访问过

	s[0] = 1; // 假设 首先加入被访问点团的是 编号为 1 的点
	printf(" 编号为 0 的点加入...\n");

	//初始化变量
	for(int i = 1; i < NUMOFDOT; i++)
	{
		lowcost[i] = c[0][i]; //后面每个点到 被访问点团的 最短距离,显然就是 编号为0的点 到自身的距离
		closest[i] = 0; //后面这些点到 被访问点团 最短距离是通过 点团 里面 编号为 0 的点得到的
		s[i] = 0; //这些点都还未被访问
	}


	for(int i = 1; i < NUMOFDOT; i++)
	{
		float min = FLT_MAX; //用来记录被挑选的点到 点团的 最短距离
		int j = 0; //j表示这一轮中被选中的点

		//编号为0的已经被加入,遍历后面 NUMOFDOT -1 个点
		for(int k = 1; k < NUMOFDOT;  k++)
		{
			//如果这个点没被访问过,并且是 所有 NUMOFDOT -1 个点中 到 点团 最短距离 的点,就加入该点
			if( (lowcost[k] < min) && ( !s[k]))
			{
				min = lowcost[k];
				j = k;
			}
		}
		
		printf(" 编号为 %d 的点加入,与其连接点时 %d\n", j, closest[j]);

		s[j] = 1; //标记j已经被访问过

	    //当j被访问之后, 未被访问的点到 这些被访问点团 的距离 可能会因为 j 的加入而改变
		for(int k = 1; k <= NUMOFDOT; k++)
		{
			if( (c[j][k] < lowcost[k]) && (!s[k] ))
			{
				lowcost[k] = c[j][k];
				closest[k] = j;
			}
		}

	}
}


以上随便写着玩的,

认真请看《算法设计与分析》



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值