数据结构与算法16:最小生成树普利姆prim算法
2014-01-21 15:05
288 查看
数据结构与算法16:普利姆prim算法
Prim算法是一个计算图的最小生成树的算法。图的最小生成树指的是一个图中去掉一些边,使得剩余的边仍然保持连通,包含全部的点,并且权值之合最小。经过这样的处理后得到的肯定是一颗树。
Prim算法和Dijkstra算法有着很相似的地方。Prim算法的大概思想是,把点划分为两个集合S和V,先放任意一个点到S中(因为随便放哪个得到的结果都是一样的),然后寻找一条边,这条边满足一端在S中,一端在V中,且权值最小,找到后把它放到边集里,把所连接的点也放到S集合中。不断进行这样的操作,直到最后V成为空集。
C语言代码。假设是无向图使用邻接矩阵存储。
Prim算法是一个计算图的最小生成树的算法。图的最小生成树指的是一个图中去掉一些边,使得剩余的边仍然保持连通,包含全部的点,并且权值之合最小。经过这样的处理后得到的肯定是一颗树。
Prim算法和Dijkstra算法有着很相似的地方。Prim算法的大概思想是,把点划分为两个集合S和V,先放任意一个点到S中(因为随便放哪个得到的结果都是一样的),然后寻找一条边,这条边满足一端在S中,一端在V中,且权值最小,找到后把它放到边集里,把所连接的点也放到S集合中。不断进行这样的操作,直到最后V成为空集。
C语言代码。假设是无向图使用邻接矩阵存储。
void prim(int g [], int n) { int isSelected ; int cost ; int prevex ; int edge [2]; int lowestCost; int vex; // 初始化 for (int i = 0; i < n; ++i) { isSelected[i] = 0; cost[i] = g[0][i]; prevex[i] = 0; } isSelected[0] = 1; for (int i = 1; i < n; ++i) // 将n-1个点加入树中 { lowestCost = INFINITE; for (j = 1; j < n; ++j) { if (cost[j] < lowestCost && isSelected[j] == 0) { vex = j; lowestCost = cost[j]; } } isSelected[vex] = 1; edge[i][0] = prevex[vex]; edge[i][1] = vex; // 刷新cost[] for (j = 1; j < n; ++j) { for (k = 0; k < n; ++k) { if (isSelected[j] == 0 && isSelected[k] == 1 && cost[j] > g[j][k]) { cost[j] = g[j][k]; prevex[j] = k; } } } } }
相关文章推荐
- 算法与数据结构(五) 普利姆与克鲁斯卡尔的最小生成树(Swift版)
- 数据结构(五)--最小生成树(普利姆算法、克鲁斯卡尔算法)
- 数据结构——最小生成树Prim算法
- 数据结构课设 公路村村通 (最小生成树prim算法)
- 算法:图的普里姆算法最小生成树-数据结构(22)
- 数据结构之图---最小生成树Prim算法---C++实现
- 数据结构实验报告-图算法-最小生成树-最短路-拓扑排序-搜索
- 数据结构——邻接矩阵的最小生成树Prim算法
- 数据结构——Prim算法——最小生成树
- 数据结构之---C语言实现最小生成树之prim(普里姆)算法
- 数据结构——邻接矩阵的最小生成Prim算法
- 数据结构(C实现)------- 最小生成树之Prim算法
- 数据结构实验之图论六:村村通公路(最小生成树prim算法)
- 数据结构——图常用算法实现(DFS,BFS,最小生成树,最短路径,拓扑序列)
- 数据结构与算法之带权图的最小生成树
- 数据结构之---C语言实现最小生成树之prim(普里姆)算法
- 数据结构_7:图算法 :图的最小生成树
- 数据结构(C实现)------- 最小生成树之Prim算法
- 【数据结构】求最小生成树的权值之和——Prim算法
- 数据结构:图——图的遍历、最小生成树、最短路径算法