Prim:求最小生成树的另一个算法

还可以用Kruskal(https://blog.csdn.net/Radium_1209/article/details/80503384)

与Kruskal的不同:Kruskal是加边,而Prim是加点

具体步骤:以任意点(一般为第一个点)为起点

                找到能以最小权能到达的点加入已访问点集合

                更新现在已访问的点能到达的其他的点的权值

                继续找点加入

例题:

布线问题

时间限制:1000 ms  |  内存限制:65535 KB
难度:4

描述
南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:
1、把所有的楼都供上电。
2、所用电线花费最少
输入
第一行是一个整数n表示有n组测试数据。(n<5)
每组测试数据的第一行是两个整数v,e.
v表示学校里楼的总个数(v<=500)
随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100)。(哪两栋楼间如果没有指明花费,则表示这两栋楼直接连通需要费用太大或者不可能连通)
随后的1行里,有v个整数,其中第i个数表示从第i号楼接线到外界供电设施所需要的费用。( 0<e<v*(v-1)/2 )
(楼的编号从1开始),由于安全问题,只能选择一个楼连接到外界供电设备。
数据保证至少存在一种方案满足要求。
输出
每组测试数据输出一个正整数,表示铺设满足校长要求的线路的最小花费。
样例输入
1
4 6
1 2 10
2 3 10
3 1 10
1 4 1
2 4 1
3 4 1
1 3 5 6
样例输出
4
来源

nyoj38

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX=505,inf=0x3f3f3f3f;
int map[MAX][MAX],lowcost[MAX],cost[MAX],vis[MAX];
int v,e,ans,t,a,b,c;void prim()
{ans=0; lowcost[1]=0; vis[1]=1;for(int i=2;i<=v;i++) //默认从第一个点出发 lowcost[i]=map[1][i]; //到点i的最小花费初始化为从第一点出发 for (int i=2;i<=v;i++){int minx=inf,pos;for (int j=1;j<=v;j++)  {if (!vis[j]&&lowcost[j]<minx) //查找最小花费的点 {minx=lowcost[j];pos=j; //标记位置 }}vis[pos]=1;ans+=minx;for (int j=1;j<=v;j++){ if (!vis[j]&&map[pos][j]<lowcost[j])lowcost[j]=map[pos][j]; //更新到每个点的最小花费}}
}int main()
{cin >> t;while(t--){memset(map,inf,sizeof(map)); //初始化map为最大值 memset(lowcost,0,sizeof(lowcost));memset(vis,0,sizeof(vis));scanf("%d%d",&v,&e);for (int i=1;i<=e;i++){scanf("%d%d%d",&a,&b,&c);map[a][b]=map[b][a]=c; }for (int i=1;i<=v;i++)scanf("%d",&cost[i]);  sort(cost+1,cost+v+1); //排序选择连接到外界的点 prim(); //求最短路printf("%d\n",ans+cost[1]);}return 0;
}

核心代码:

1.默认从第一点开始初始化

2.找最小权的点,并更新到其他点的权(重复v-1次)

void prim()
{//第一部分初始化 ans=0; lowcost[1]=0; vis[1]=1;for(int i=2;i<=v;i++) //默认从第一个点出发 lowcost[i]=map[1][i]; //到点i的最小花费初始化为从第一点出发 //第二部分找最小权的点 for (int i=2;i<=v;i++){int minx=inf,pos;for (int j=1;j<=v;j++)  {if (!vis[j]&&lowcost[j]<minx) //查找最小花费的点 {minx=lowcost[j];pos=j; //标记位置 }}vis[pos]=1; //标记已访问 ans+=minx; //更新答案//更新访问后到各点的权 for (int j=1;j<=v;j++){ if (!vis[j]&&map[pos][j]<lowcost[j])lowcost[j]=map[pos][j]; //更新到每个点的最小花费}}
}

转载于:https://www.cnblogs.com/Radium1209/p/10415370.html

Prim算法(最小生成树;例题:nyoj38)相关推荐

  1. prim算法 最小生成树

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

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

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

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

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

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

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

  5. Prim算法、Kruskal算法

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

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

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

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

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

  8. 最小生成树(Kruskal算法+Prim算法)简单讲解+最小生成树例题 acm寒假集训日记22/1/8

    算法简讲部分: Kruskal算法: 基于贪心策略大致过程分为第三步:1. 我们先用结构体把每条边的端点和权值记录下来,然后对每条边按权值进行排序2. 因为 使图连通最少需要n-1 条边,所以我们依次 ...

  9. 图论总结(欧拉路+Floyd所有结点最短+Bellman-Ford算法+SPFA+Dijsktra算法+Tarjan算法+最小生成树(prim+kruskal) )

    目录 欧拉路 判断欧拉路是否存在: ​​​​​​​ 最短路: Floyd算法 : ​​​​​​​​​​​​​​ Bellman-Ford: ​​​​​​​ Dijkstra 单源最短路 先附上例题: ...

  10. 最小生成树——普里姆(Prim)算法

    Prim算法的基本思想是以顶点为主导地位:从起始顶点出发,通过选择当前可用的最小权值的边把其他顶点加入到生成树中来.设连通无向网为G(V,E),在普里姆算法中,将顶点集合V分成两个子集T和T'. (1 ...

最新文章

  1. The listener supports no services
  2. 我们是如何使用 PingCode Flow 实现研发自动化管理的?
  3. [导入]金山词霸2005精简版下载地址
  4. NameNode中几个关键的数据结构
  5. jvm类加载、初始化
  6. Windows 中进程的相关操作
  7. Express + Element-ui 实现图片/文件上传
  8. php如何避免时间重复,如何避免/停止php和html的重复插入?
  9. php 怎么循环数组取有值的,php怎么循环数组取有值的-PHP问题
  10. nginx 端口转发
  11. 老板思维:工作负责人是首问责任制
  12. mysql创建联合唯一索引
  13. php图片写入带问号_php-fpm Remote Code Execution 分析(CVE-2019-11043)
  14. Python求解进制问题(阿里巴巴2015笔试题)
  15. java删除cookie_JAVAWEB使用保存cookie、删除cookie、获取cookie工具类
  16. python马尔科夫链蒙特卡洛(MCMC)方法pyMC
  17. 短距离无线通信之蓝牙模块
  18. HECTF2021 Reverse wp
  19. VDI虚拟桌面基础架构
  20. MySQL的定时任务详解

热门文章

  1. cocospod 安装和使用
  2. Mysql事务字符集
  3. 删除字符串最后一个字符的几种方法
  4. iOS UITableView的方法解析
  5. 用Visual C#做DLL文件
  6. 纠结的Python2.7编码与os.walk()函数的目录参数
  7. python能解密java的,在python中解码Java对象
  8. memcpy-结构体的复制
  9. 行为翻译模型是人脑的核心
  10. 如何使用小数据集对大模型进行微调(迁移学习)-微迁移