Prim算法(最小生成树;例题:nyoj38)
Prim:求最小生成树的另一个算法
还可以用Kruskal(https://blog.csdn.net/Radium_1209/article/details/80503384)
与Kruskal的不同:Kruskal是加边,而Prim是加点
具体步骤:以任意点(一般为第一个点)为起点
找到能以最小权能到达的点加入已访问点集合
更新现在已访问的点能到达的其他的点的权值
继续找点加入
例题:
布线问题
- 描述
-
南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:
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)相关推荐
- prim算法 最小生成树
Prim算法 Prim算法的由来 Prim算法利用了MST的性质:假设N= (V,E)是一个连通图,U是顶点集V的一个非空子集,若(u,v)是一条最小权值的边,其中u属于U,v属于V-U,则必存在一颗 ...
- prim算法 + 最小生成树的打印 C语言
问题 要在n个城市之间假设网络,要求只架设n-1条线路,并保证个城市之间网络链接,已知城市间架设网络的统计数据,其中列出了有可能架设的网络和对应的成本求最低价格方案,以图形方式给出架设方案,并输出求解 ...
- Prim算法最小生成树Java超详解
算法简介 算法流程 具体实现 Code Input Output 使用优先队列实现 API说明 Code Input Output 算法简介 Prim算法计算最小生成树,它的每一步都会为一颗生长树添加 ...
- D-OJ刷题日记:使用邻接矩阵实现最小生成树Prim算法 题目编号:1135
理解: [理解prim算法本质--让一棵小树逐渐长大] Prim算法:又称为加边法,即每次选择最小权值的边加入到生成树中,然后再更新权值,如此反复,保证每次最优来达到最优解. Prim算法生成树用的是 ...
- Prim算法、Kruskal算法
文章目录 Prim算法 Kruskal算法 主要内容: Prim算法 最小生成树对应的问题一般都是无向图,最小生成树所构成的图总边权之和最小,但不能是环,否则不能称之为"最小". ...
- 数据结构与算法-Prim算法解析与解决修路最小生成树问题
文章目录 简介 Prim算法 最小生成树 应用场景 问题描述 思路分析 代码实现 简介 Prim算法 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索 ...
- c语言随机prim算法的迷宫生成,Prim算法生成迷宫
初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...
- 最小生成树(Kruskal算法+Prim算法)简单讲解+最小生成树例题 acm寒假集训日记22/1/8
算法简讲部分: Kruskal算法: 基于贪心策略大致过程分为第三步:1. 我们先用结构体把每条边的端点和权值记录下来,然后对每条边按权值进行排序2. 因为 使图连通最少需要n-1 条边,所以我们依次 ...
- 图论总结(欧拉路+Floyd所有结点最短+Bellman-Ford算法+SPFA+Dijsktra算法+Tarjan算法+最小生成树(prim+kruskal) )
目录 欧拉路 判断欧拉路是否存在: 最短路: Floyd算法 : Bellman-Ford: Dijkstra 单源最短路 先附上例题: ...
- 最小生成树——普里姆(Prim)算法
Prim算法的基本思想是以顶点为主导地位:从起始顶点出发,通过选择当前可用的最小权值的边把其他顶点加入到生成树中来.设连通无向网为G(V,E),在普里姆算法中,将顶点集合V分成两个子集T和T'. (1 ...
最新文章
- The listener supports no services
- 我们是如何使用 PingCode Flow 实现研发自动化管理的?
- [导入]金山词霸2005精简版下载地址
- NameNode中几个关键的数据结构
- jvm类加载、初始化
- Windows 中进程的相关操作
- Express + Element-ui 实现图片/文件上传
- php如何避免时间重复,如何避免/停止php和html的重复插入?
- php 怎么循环数组取有值的,php怎么循环数组取有值的-PHP问题
- nginx 端口转发
- 老板思维:工作负责人是首问责任制
- mysql创建联合唯一索引
- php图片写入带问号_php-fpm Remote Code Execution 分析(CVE-2019-11043)
- Python求解进制问题(阿里巴巴2015笔试题)
- java删除cookie_JAVAWEB使用保存cookie、删除cookie、获取cookie工具类
- python马尔科夫链蒙特卡洛(MCMC)方法pyMC
- 短距离无线通信之蓝牙模块
- HECTF2021 Reverse wp
- VDI虚拟桌面基础架构
- MySQL的定时任务详解