您的位置:首页 > 其它

Prim — 最小生成树

2015-07-26 14:26 197 查看
Prim算法,普里姆算法,在无向图中搜索最小生成树。

算法实现的主要步骤:

(1) 初始化

所有点都初始化为没有被访问,初始化根结点到各结点的距离,存放在lowcost[]数组中;

(2)寻找最小值

从根结点开始,其依据:一端连接,另一端未连接,寻找最小值

找到最小值后,更新lowcost[],未选结点到已选结点(可能已经选中了多个结点)中的最小值

(3)重复第(2)步,直到所有点都被选中,则算法结束。

本文依据下图对算法实现:



具体代码如下,已经**在vs2010测试通过**。

#include <iostream>
using namespace std;

#define UndirectedGraphNode 6
#define INFINITE 1000

void Prim(int undirectedGraph[][UndirectedGraphNode], bool visited[], int lowcost[], int path[])
{
//初始化
memset(visited, 0, sizeof(bool) * UndirectedGraphNode);//所有点都没有被访问
for(int i = 1; i < UndirectedGraphNode; i++)
lowcost[i] = undirectedGraph[0][i];//根结点到各结点的距离

//根结点被访问
int k = 0;//记录加入路径中的结点的顺序
visited[0] = true;
path[k] = 0;//记录加入路径中的结点的下标
int min;
int minIndex;

//一端连接,另一端未连接,寻找最小值
for(int j = 1; j < UndirectedGraphNode; j++)//外层循环,每次循环确定一个点
{
min = INFINITE;//每次循环要重新赋值
//寻找最小值
for(int i = 1; i < UndirectedGraphNode; i++)
{
//存在多个条件的判断,应将最可能为假的条件放在前面,减少判断次数
if(false == visited[i] && lowcost[i] < min)
{
min = lowcost[i];
minIndex = i;
}
}

path[++k] = minIndex;//对应结点加入路径中,区分 ++k 与 k++
visited[minIndex] = true;//该点已经被访问

//更新lowcost[]
//lowcost[],未选结点到已选结点中的最小值
for(int i = 1; i < UndirectedGraphNode; i++)
{
if(false == visited[i] && lowcost[i] > undirectedGraph[minIndex][i])
lowcost[i] = undirectedGraph[minIndex][i];
}
}
}

void PrimRun()
{
//点与点之间存在边,权重为非零值,非无穷大值
//点与点之间不存在边,权重为无穷大值
int undirectedGraph[][UndirectedGraphNode] =
{
{INFINITE, 12, INFINITE, INFINITE, 9, 9},
{12, INFINITE, 6, INFINITE, INFINITE, 15},
{INFINITE, 6, INFINITE, 3, INFINITE,  17},
{INFINITE, INFINITE, 3, INFINITE, 4, 20},
{9, INFINITE, INFINITE, 4, INFINITE,  9},
{9, 15, 17, 20, 9, INFINITE},
};

bool visited[UndirectedGraphNode];
int path[UndirectedGraphNode];
int lowcost[UndirectedGraphNode];

Prim(undirectedGraph, visited, lowcost, path);

for(int i = 0; i < UndirectedGraphNode; i++)
cout<<"v"<<path[i] + 1<<" ";//v1表示第一个结点
cout<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
PrimRun();//调用
return 0;
}


算法运行结果如图所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: