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;
}
}
}
}
以上随便写着玩的,
认真请看《算法设计与分析》