Prim算法

  • Prim算法的由来

    Prim算法利用了MST的性质:假设N= (V,E)是一个连通图,U是顶点集V的一个非空子集,若(u,v)是一条最小权值的边,其中u属于U,v属于V-U,则必存在一颗包含(u,v)的最小生成树。

  • Prim算法的实现
    普里姆算法的实现假设一个无向网G以邻接矩阵形式存储,从顶点u出发构造G的最小生成树T,要求输出T的各条边。为实现这个算法需附设一个辅助数组closedge,以记录从U到V-U具有最小权值的边。。对每个顶点v∈V-U,在辅助数组中存在一个相应分量closedge[i-1],它包括两个域:lowcost和adjvex,其中lowcost存储最小边上的权值,adjvex存储最小边在U中的那个顶点。显然,closedge[i-1].-lowcost=min{cost(u,vi)lu∈U}其中cost(u,v)表示赋于边(u,v)的权。
    图例:

 //辅助数组结构typedef struct{string adjvex;//最小边在U的那个顶点int lowcost;//最小边的权值}closedge[MVNum];//辅助数组结构
  • Prim算法步骤
    ①首先将初始顶点u加入U中,对其余的每一个顶点,将closedge均初始化为到u的边信息。
    ②循环n-1次,做如下处理:
    ● 从各组边closedge中选出最小边closedge[k],输出此边;
    ●将k加入U中;
    ●更新剩余的每组最小边信息closedgel,对于V-U中的边,新增加了一条从k到j的边,如果新边的权值比closedge.lowcost小,则将closedgelowcost更新为新边的权值。

  • 运行结果

  • 实现代码
    邻接矩阵和邻接表分别实现


/*邻接矩阵实现若要邻接表实现,初始化V时,只需将生成树的顶点的邻接边的权值赋给辅助数组,其余的全部辅为maxint更新最小边时同样如此
*/#include<iostream>#include<string>using namespace std;#define OK 1#define ERROR 0#define MAXint 32767 //表示无穷大#define MVNum 100    //最大顶点数//邻接矩阵的结构typedef struct{string vexs[MVNum];//顶点表int arcs[MVNum][MVNum];//邻接矩阵,也就是表示边的权值int vexnum, arcnum;//图的顶点数和边的个数}AMGraph;//邻接矩阵的结构//邻接表的结构typedef struct ArcNode {//边结点int adjvex;//该边所指向的顶点的位置struct  ArcNode* nextarc;//指向下一条边的指针int info;//和边相关的信息}ArcNode;typedef struct {//顶点信息string data;ArcNode* firstarc;//指向第一条依附该顶点的边的指针}VNode, AdjList[MVNum];typedef struct//邻接表{AdjList vertices;//顶点信息int vexnum, arcnum;//图的当前顶点数和边数}ALGraph;//邻接表的结构//查询结点位置int Locate(AMGraph G, string v){for (int i = 0; i < G.vexnum; i++){if (G.vexs[i] == v){return i;}}return -1;}//查询结点位置int Locate(ALGraph G, string v)//Locate重载{for (int i = 0; i < G.vexnum; i++){if (G.vertices[i].data == v){return i;}}return -1;}//辅助数组结构typedef struct{string adjvex;//最小边在U的那个顶点int lowcost;//最小边的权值}closedge[MVNum];//辅助数组结构//创建邻接矩阵int CreateUDN(AMGraph& G)//无向图的构造{cout << "请输入图的顶点数和边数:";cin >> G.vexnum >> G.arcnum;cout << "请输入各点的信息:";for (int i = 0; i < G.vexnum; i++){cin >> G.vexs[i];}for (int i = 0; i < G.vexnum; i++)//初始化边的权值为MAXINT{for (int j = 0; j < G.vexnum; j++){G.arcs[i][j] = MAXint;}}cout << "各边的顶点信息和权值:";for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵{string v1, v2;int w;//边的两个顶点以及权值cin >> v1 >> v2 >> w;int i = Locate(G, v1);//找到点的位置int j = Locate(G, v2);G.arcs[i][j] = w;//赋予权值G.arcs[j][i] = G.arcs[i][j];}return OK;}//创建邻接矩阵//创建邻接表int CreateUDG(ALGraph& G){cout << "请输入图的顶点数和边数:";cin >> G.vexnum >> G.arcnum;//输入顶点数和边数cout << "请输入各个顶点的信息:";for (int i = 0; i < G.vexnum; i++)//初始化顶点信息{cin >> G.vertices[i].data;//输入顶点的信息G.vertices[i].firstarc = NULL;//firstarc置空}cout << "请输入各边的顶点信息和权值:";for (int k = 0; k < G.arcnum; k++){string v1, v2;int weight;//权值cin >> v1 >> v2 >> weight;//输入一条边依附的两个顶点int i = Locate(G, v1);int j = Locate(G, v2);ArcNode* p1 = new ArcNode;p1->info = weight;p1->adjvex = j;p1->nextarc = G.vertices[i].firstarc;G.vertices[i].firstarc = p1;ArcNode* p2 = new ArcNode;p2->info = weight;p2->adjvex = i;p2->nextarc = G.vertices[j].firstarc;G.vertices[j].firstarc = p2;}return OK;}//创建邻接表//找到权值最小的边int Min(closedge s,int len){int min = MAXint;int k = -1;for (int i = 0; i < len; i++){if (s[i].lowcost < min && s[i].lowcost != 0){min = s[i].lowcost;k = i;}}return k;}//找到权值最小的边//prim最小生成树算法void MiniSpanTree_Prim(AMGraph G, string u){closedge close;int k = Locate(G, u);//k为顶点u的下标for (int i = 0; i < G.vexnum; i++)//对V-U的每一个顶点vj,初始化close;{if (k != i){close[i] = { u,G.arcs[k][i] };}}close[k].lowcost = 0;//初始化U,此时U中只有u一个顶点for (int i = 1; i < G.vexnum; i++){k = Min(close,G.vexnum);//找到与u权值最小的边string u0 = close[k].adjvex;//最小边的一个顶点string v0 = G.vexs[k];//最小边的另一个顶点cout << u0 <<"-"<< v0 << endl;//输出最小边close[k].lowcost = 0;//把此顶点并入U集for (int i = 0; i < G.vexnum; i++)//新节点并入U后重新选择最小边{if (G.arcs[k][i] < close[i].lowcost){close[i] = {G.vexs[k],G.arcs[k][i]};}}}}//prim最小生成树算法//prim最小生成树算法void MiniSpanTree_Prim(ALGraph G, string u){closedge close;int k = Locate(G, u);//k为顶点u的下标for (int i = 0; i < G.vexnum; i++){close[i] = { u,MAXint };}ArcNode* p = new ArcNode;p = G.vertices[k].firstarc;while (p){close[p->adjvex] = { u,p->info };p = p->nextarc;}close[k].lowcost = 0;//初始化U,此时U中只有u一个顶点for (int i = 1; i < G.vexnum; i++){k = Min(close, G.vexnum);//找到与u权值最小的边string u0 = close[k].adjvex;//最小边的一个顶点string v0 = G.vertices[k].data;//最小边的另一个顶点cout << u0 << "-" << v0 << endl;//输出最小边close[k].lowcost = 0;//把此顶点并入U集ArcNode* arc = G.vertices[k].firstarc;while (arc){if (arc->info < close[arc->adjvex].lowcost){close[arc->adjvex] = {G.vertices[k].data,arc->info};}arc = arc->nextarc;}}}//prim最小生成树算法/*v1 v2 v3 v4 v5 v6v1 v2 6 v1 v3 1 v1 v4 5 v3 v2 5 v3 v4 5 v3 v5 6 v3 v6 4 v2 v5 3 v5 v6 6 v4 v6 2v1*/int main(){ALGraph G;CreateUDG(G);cout << "您要构造的最小生成树的起点:";string v;cin >> v;MiniSpanTree_Prim(G, v);return 0;
}

prim算法 最小生成树相关推荐

  1. prim算法 + 最小生成树的打印 C语言

    问题 要在n个城市之间假设网络,要求只架设n-1条线路,并保证个城市之间网络链接,已知城市间架设网络的统计数据,其中列出了有可能架设的网络和对应的成本求最低价格方案,以图形方式给出架设方案,并输出求解 ...

  2. Prim算法最小生成树Java超详解

    算法简介 算法流程 具体实现 Code Input Output 使用优先队列实现 API说明 Code Input Output 算法简介 Prim算法计算最小生成树,它的每一步都会为一颗生长树添加 ...

  3. D-OJ刷题日记:使用邻接矩阵实现最小生成树Prim算法 题目编号:1135

    理解: [理解prim算法本质--让一棵小树逐渐长大] Prim算法:又称为加边法,即每次选择最小权值的边加入到生成树中,然后再更新权值,如此反复,保证每次最优来达到最优解. Prim算法生成树用的是 ...

  4. Prim算法、Kruskal算法

    文章目录 Prim算法 Kruskal算法 主要内容: Prim算法 最小生成树对应的问题一般都是无向图,最小生成树所构成的图总边权之和最小,但不能是环,否则不能称之为"最小". ...

  5. 数据结构与算法-Prim算法解析与解决修路最小生成树问题

    文章目录 简介 Prim算法 最小生成树 应用场景 问题描述 思路分析 代码实现 简介 Prim算法 ​ 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索 ...

  6. c语言随机prim算法的迷宫生成,Prim算法生成迷宫

    初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...

  7. 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)

    目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...

  8. 【数据结构】最小生成树 Prim算法 Kruskal算法

    最小生成树应用场景: 假设以下场景,有一块木板,板上钉上一些钉子,这些钉子可以由一些细绳连接起来.假设每个钉子可以通过一根或者多根细绳连接起来,那么一定存在这样得情况,即用最少的细绳把所有的钉子连接起 ...

  9. 生成树的概念,最小生成树Prim算法 Kruskal算法

    求解最小生成树可以用Prim算法 Kruskal算法

最新文章

  1. 海淀温泉镇迎来大爆发!5G基站、产业转移示范基地、自动驾驶核心测试区.........
  2. 使用DPM 2012 Sp1保护SQL server 2012 Sp1
  3. python: 判断字符串是否为合法的json格式
  4. linux系统服务器性能综合测试(UnixBench5)
  5. 利用Crawlspider爬取腾讯招聘数据(全站,深度)
  6. dbproviderfactories.getfactory mysql_asp.net下使用DbProviderFactories的数据库操作类
  7. 明天起100亿消费券来袭,请作好准备!
  8. button标签设置隐藏和显示_让你更高效的功能——设置、预设的妙用【动态数学软件GeoGebra】...
  9. bat文件备份MySQL数据库
  10. 恭祝月圆·家圆·团圆
  11. Sublime Text 3 Key
  12. 网易数帆、云音乐、Intel、有赞最新大数据实践(PPT下载+视频回放)
  13. Multisim 安装、破解、汉化、卸载教程
  14. JavaScript实现类似百度的智能搜索框
  15. Python中一些少数人知晓且有趣的特性
  16. mysql查询的结果拼接字符串_MySql查询结果拼接成字符串
  17. 签名申请问题(100%成功)
  18. 计算机专业分类分级,计算机等级分级
  19. ORACLE数据库练习题整理(2)
  20. 做一个简单计算器(两个数的加减乘除)扣扣116119409

热门文章

  1. WM6.5中隐藏和显示任务栏、命令栏及输入面板
  2. 随想录(smp的一些注意事项)
  3. 一步一步写算法(之选择排序)
  4. 体育计算机培训心得,体育网络培训心得
  5. php漏洞黑掉数据库,WDCPnbsp;add_user.php任意数据库添加任意用户漏洞分析
  6. matlab双立方插值法_双三次插值(Bicubic interpolation)缩放图片
  7. python作者 es6_es6之js的类
  8. 分析dmp文件使用表空间_R语言使用贝叶斯层次模型进行空间数据分析
  9. html dw map,DW十六 map标签
  10. 原生JDBC连接MySQL数据库踩的坑