最小生成树算法之Prim算法
生成树
一个连通图的生成树是一个极小连通子图,它含有图中全部n个顶点和构成一棵树的(n-1)条边。
- 连通图由一次遍历就可以产生生成树
- 由深度优先遍历得到的生成树称为深度优先生成树。
- 由广度优先遍历得到的生成树称为广度优先生成树。
一个连通图的生成树不一定是唯一的!
最小生成树
对于带权连通图G (每条边上的权均为大于零的实数),可能有多棵不同生成树。
每棵生成树的所有边的权值之和可能不同。
其中权值之和最小的生成树称为图的最小生成树。
Prim算法
普里姆(Prim)算法是一种构造性算法,用于构造最小生成树。过程如下:
- 初始化U={v}。v到其他顶点的所有边为候选边;
- 重复以下步骤n-1次,使得其他n-1个顶点被加入到U中:
- 从候选边中挑选权值最小的边输出,设该边在V-U中的顶点是k,将k加入U中;
- 考察当前V-U中的所有顶点j,修改候选边:若(j,k)的权值小于原来和顶点k关联的候选边,则用(k,j)取代后者作为候选边。
代码
Prim 算法构造生成树
//Prim 算法构造生成树
void Prim(MatGraph g, int v)
{int lowcost[MAXV];//存储权值int MIN;int closest[MAXV], i, j, k;
//closet是用来存储与它相邻的节点的for (i = 0; i < g.n; i++){lowcost[i] = g.edges[v][i]; //初始化closest[i] = v;}for (i = 1; i < g.n; i++){MIN = INF;for (j = 0; j < g.n; j++)if (lowcost[j] != 0 && lowcost[j] < MIN){MIN = lowcost[j];k = j; //记录最近的节点的编号}printf("边(%d,%d)权为:%d\n", closest[k], k, MIN);lowcost[k] = 0;for (j = 0; j < g.n; j++)if (lowcost[j] != 0 && g.edges[k][j] < lowcost[j]) //寻找有没有比较小的边{lowcost[j] = g.edges[k][j];closest[j] = k;}}
}
测试代码
# include <stdio.h>
# include <stdlib.h>
#define ElemType int
#define maxsize 100
#define InfoType int
#define MAXV 100
#define MaxSize 100
#define INF 214748364
#define INFINITE INF
//邻接矩阵的数据类型
typedef struct s
{int no; //顶点编号InfoType info;//顶点的其他信息
} VertexType; //顶点的类型typedef struct SS
{int edges[MAXV][MAXV]; //邻接矩阵的数组int n, e; //图的顶点数和边数VertexType vexs[MAXV]; //存放顶点信息
} MatGraph;
/////Prim 算法构造生成树
void Prim(MatGraph g, int v)
{int lowcost[MAXV];int MIN;int closest[MAXV], i, j, k;for (i = 0; i < g.n; i++){lowcost[i] = g.edges[v][i]; //initclosest[i] = v;}for (i = 1; i < g.n; i++){MIN = INF;for (j = 0; j < g.n; j++)if (lowcost[j] != 0 && lowcost[j] < MIN){MIN = lowcost[j];k = j; //记录最近的节点的编号}printf("边(%d,%d)权为:%d\n", closest[k], k, MIN);lowcost[k] = 0;for (j = 0; j < g.n; j++)if (lowcost[j] != 0 && g.edges[k][j] < lowcost[j]){lowcost[j] = g.edges[k][j];closest[j] = k;}}
}
//
void InitMatGraph(MatGraph & g, int a[][MAXV], int n, int e)
{int i, j;g.n = n;g.e = e;for(i = 0; i< n; i++)for(j = 0; j < n; j++)g.edges[i][j] = a[i][j];
}int main ()
{//注意无向带权图i=j是为0int a[4][MAXV] = {{0, 1, 3, 1},{1, 0, 2, 4},{3, 2, 0, INF},{1, 4, INF, 0}};MatGraph g;InitMatGraph(g, a, 4, 5);Prim(g, 0);return 0;
}
测试结果
Enjoy
最小生成树算法之Prim算法相关推荐
- 最小生成树:Kruskal算法 和 Prim算法(第23章)
武侠: 飞雪连天射白鹿,笑书神侠倚碧鸳. --金庸十四著作 飞狐外传 .雪山飞狐 .连城诀 .天龙八部 .射雕英雄传 .白马啸西风 .鹿鼎记 .笑傲江湖 .书剑恩仇录 .神雕侠侣 .侠客岛 .倚天屠龙 ...
- 最小生成树 Kruskal 和 Prim算法及堆优化
目录 生成树/最小生成树是什么. 一.Kruskal算法 Kruskal模板 二.Prim算法及堆优化 1.遍历 Prim 普通模板 2.堆优化 Prim 堆优化模板 解决最小生成树的问题之前,我们先 ...
- 学习进度2012-6-26(动态规划算法、Prim算法、Dijkstra算法)
今天学习下三个算法:动态规划算法.Prim算法.Dijkstra算法,将自己理解的逻辑略作总结. 1.动态规划算法是选取两个字符串的最长子序列的解法作为切入点学习,在公司午休时间将代码写了下,初步测试 ...
- Kruskal算法与Prim算法
(话说这么些算法的名字嗯... Kruskal算法:(下文它就暂时叫k算法吧 k算法是一种应用贪心思想及并查集,在图中查找最小生成树的算法. (最小生成树:若一个无向图内任意两个顶点联通切图为一棵树, ...
- 普里姆算法(Prim算法)
普里姆算法(Prim算法) 简介 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex ...
- Kruskal 算法与 Prim 算法
一:无向带权图的最小生成树 无向带权图是图论算法领域中的一种基础模型.它的代码实现我们就不在这篇文章中介绍了,大家可以参考文章后面给出的代码链接.下图为一个无向带权图的示例: 接下来我们着重介绍一下图 ...
- 【算法】prim算法(最小生成树)(与Dijkstra算法的比较)
最小生成树: 生成树的定义:给定一个无向图,如果它的某个子图中任意两个顶点都互相连通并且是一棵树,那么这棵树就叫做生成树.(Spanning Tree) 最小生成树的定义:在生成树的基础上,如果边上有 ...
- * poj 1251 JungleRoad 最小生成树 Kruskal算法、Prim算法
文章目录 Kruskal算法 模板:https://blog.csdn.net/Rain722/article/details/65642992 Prim算法 模板: poj 1251 JungleR ...
- 最小生成树实验报告c语言,最小生成树(C语言, prim算法)
图(来源:<>p250) #include #include #include /* * 邻接矩阵, prim普里姆算法(属贪婪算法),无向图,最小生成树 * 代码实现<>p2 ...
- 转 最小生成树(kruskal 算法 和prim算法)
链接:http://blog.csdn.net/weinierbian/article/details/8059129/ 给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这 ...
最新文章
- rdlc报表显示条码 .
- C语言数据结构(大话数据结构——笔记4)第六章:树
- Unet项目解析(4): ./src/RetinaNN_predict.py
- 神经网络中的反向传播算法
- flask standrad class 使用
- UE4 在C++ 动态生成几何、BSP体、BRUSH ---- MESH_GENERATION
- vscode open with live server_vscode容器开发填坑记录remote-container
- 【Java并发性和多线程】如何创建并运行java线程
- java如何设置文本框提示_[Java教程]一个友好的文本框内显示提示语 jquery 插件
- Android------Button 添加声音效果(两种方式)
- 问题 A: 【一本通提高组合数学】Bullcow 牡牛和牝牛
- angularjs 资源集合
- 【机器学习】误差逆传播算法(反向传播算法)
- Service: 三、小窗口(浮窗) 播放视频
- 基于滑窗捕获的伪卫星系统抗远近效应方法研究
- 字体转换 (代码整理 备忘)
- 毕得医药通过科创板注册:年营收6亿 戴岚姐弟为实控人
- NEFU 大一寒假训练十二(set)2020.02.18
- 【H5】 h5运行在手机浏览器查看控制台信息
- clonezilla(再生龙)克隆linux系统 操作指南
热门文章
- Netflix/conductor学习笔记(1)
- OpenWrt 把SD卡挂载到 /overlay
- DTU有什么用?工业级DTU的特点是啥?
- 2013年深圳百公里徒步感悟
- C语言:链表(动态)创建之头插法和尾插法
- 数据库设计案例(1)
- 多节点什么网络取得技术性突破_中国学者研究“多节点量子网络”取得基础性突破...
- Pillow和OpenCV转numpy数组
- 问题解决模型ORID
- 主板后置音频接口图解_图解主板前置音频线接法(一)