Prim — 最小生成树
2015-07-26 14:26
197 查看
Prim算法,普里姆算法,在无向图中搜索最小生成树。
算法实现的主要步骤:
(1) 初始化
所有点都初始化为没有被访问,初始化根结点到各结点的距离,存放在lowcost[]数组中;
(2)寻找最小值
从根结点开始,其依据:一端连接,另一端未连接,寻找最小值
找到最小值后,更新lowcost[],未选结点到已选结点(可能已经选中了多个结点)中的最小值
(3)重复第(2)步,直到所有点都被选中,则算法结束。
本文依据下图对算法实现:
算法运行结果如图所示:
算法实现的主要步骤:
(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; }
算法运行结果如图所示:
相关文章推荐
- SERDES总结
- muduo库MutexLock、MutexLockGuard、Contidion、CountDownLatch分析
- VC++中的字符问题
- 常见排序算法(java实现)
- 循环
- 并查集模板
- UVa 11235 FrequentValues(RMQ)
- COJ 1224 ACM小组的古怪象棋
- 搬家啦~搬到博客园去
- JAVA集中中 List Set Map 区别和关系
- 嵌入式系统基础知识------之嵌入式系统中信息表示与运算基础(1.4)
- Oracle11g监听程序当前无法识别连接描述符中请求的服务
- 关于Shell 脚本的export语句
- CentOS 6.4 内核升级(2.6.32 -> 3.18.19)
- 揭密黑客轻易成为百万富翁之路
- HDOJ_Problem Archive_1004_Let the Balloon Rise
- SQL基础学习_02_查询
- Ubuntu LTS14.04 安装Drush, drupal, omega subtheme遇到的问题
- mysql101个调节和优化的方法
- eclipse编辑器下显示文件路径