Prim算法与Dijstra算法
注:参考如下文章和视频
不能说毫不相干,简直是一模一样(Prim vs Dijkstra)
普里姆和迪杰斯特拉太像了,他们有什么区别?
Prim算法和Dijkstra算法区别
文章目录
- 总结
- 数组元素的更新
- 两种算法的完整代码
- 普里姆算法
- 算法步骤
- 算法描述
- 迪杰斯特拉算法
- 算法步骤
- 算法描述
- 补档
- Prim算法的C语言实现
- Dijkstra算法的C语言实现
总结
Prim算法解决连通无向有权图中最小生成树问题,而Dijkstra算法解决是源点到其余节点的最短路径问题。
两个算法在添加新结点时,都是选择“距离最短”的结点加入集合,但是Prim算法中,“距离最短”是指未访问的结点到已经访问的所有结点的一个集合的距离最小,将距离最小的结点加入到已访问的集合中;而在Dijkstra算法中,“距离最短”是指所有未访问结点到源点距离最小。
注:集合理解为将所有已访问的结点看成一个结点。
在Prim算法中,数组元素dist[i]
表示未访问结点i
到已访问结点集合的最短距离。而Dijkstra算法中,数组元素dist[i]
表示未访问结点i
到源点的最短距离。
数组元素的更新
//Prim算法
for(int i = 0; i < n; i++){ //G表示连通无向有权图,u表示新加入的结点。if(!vist[i] && G[u][i] < dist[i]){dist[i] = G[u][i];}
}//Dijkstra算法
for(int i = 0; i < n; i++){//注意两者在更新最短距离的区别,可以说这是两者唯一的区别if(!vist[i] && G[u][i] + dist[u] < dist[i]){dist[i] = G[u][i] + dist[u];}
}
两种算法的完整代码
void Prim(){fill(vis, 0, maxn);int len = 0;dist[0] = 0;for(int i = 1; i < n; i++){ //初始化数组dis[]dist[i] = G[0][i];}for(int i = 0; i < n; i++){int u = -1, min = INF;for(int j = 0; j < n; j++){if(!vist[j] && dist[j] < min){u = j;min = dist[j];}}if(u == -1) return ;len += min; vist[u] = 1;for(int v = 0; v < n; v++){if(!vist[v] && G[u][v] < dist[v])dist[v] = G[u][v];}}
}
void Dijkstra(){fill(vis, 0, maxn);fill(dis, dis + maxn, inf);dis[0] = 0; //将0设置为源点,同理可设置目标点,只需添加一个if判断即可for(int i = 0; i < n; i++){int u = -1, min = INF;for(int j = 0; j < n; j++){if(!vist[j] && dist[j] < min){u = j;min = dist[j];}}if(u == -1) return ;vis[u] = 1;for(int v = 0; v < n; v++){if(!vist[v] && G[u][v] + dist[u] < dist[v])dist[v] = G[u][v] + dist[u];}}
}
普里姆算法
算法步骤
1)首先将初始顶点u
加入 U U U中,对其与的每一个顶点 v j v_j vj,将closedge[j]
均初始化为到u
的信息。
2)循环n-1
次,做如下处理
- 从各组边
closedge
中选出最小的边closedgeK[k]
,输出此边; - 将
k
加入 U U U中; - 更新剩余的每组最小边信息
closedge[j]
,对于 V − U V-U V−U中的边,新增了加了一条从k
到j
的边,如果新边的权值比closedge[j].lowcost
更新为新的边的权值。
算法描述
//辅助数组的定义,用来记录从顶顶点集U到V-U的权值最小的边
struct
{VerTexType adjvex;//最小边在U中的那个顶点ArcType lowcost;//最小边上的权值
}closedge[MVNum];void MiniSpanTree_Prim(AMGraph G,VerTexType U)
{//无向网G以邻接矩阵形式存储,从顶点u出发构造G的最小生成树T,输出T的各条边k=LocateVex(G,u);//k为顶点u的下标for(j=0;j<G.vexnum;++j)//对v-U的每一个顶点初始化closedge[j]if(j!=k) closedge[j]={u,G.arcs[k] [j])};//{adjvex,lowcost)closedge[k].lowcost=0;//初始,U={u}for(i=1;i<G.vexnum;++i){//选择其余n-1个顶点,生成n-1条边(n=G.vexnum)k=Min(closedge);//求出T的下一个节点:第k个顶点,closedge[k]中存有当前最小边u0=closedge[k].adjvex;//u0为最小边的一个顶点,u0∈Uv0=G.vexs[k];//v0为最小边的另一个顶点,v0∈V-Ucout<<u0<<v0;//输出当前的最小边(u0,v0)closedge[k].lowcost=0;//第k个顶点并人U集for(j=0;j<G.vexnum;++j)if(G.arcs[k][j]<closedge[j].lowcost)//新顶点并人U后重新选择最小边closedge[j]={G.vexs[k],G.arcs[k] [j]];//for}
}
迪杰斯特拉算法
算法步骤
算法描述
补档
Prim算法的C语言实现
#include <stdio.h>
#include <limits.h>#define MAX_V 100
#define INF INT_MAXint graph[MAX_V][MAX_V]; // 邻接矩阵
int key[MAX_V]; // 存储最小边权
int parent[MAX_V]; // 存储生成树中的边
int inMST[MAX_V]; // 标记顶点是否在最小生成树中void prim(int start, int n) {for (int i = 0; i < n; i++) {key[i] = INF; // 初始化为无穷大inMST[i] = 0; // 初始化为不在生成树中parent[i] = -1; // 初始化父节点}key[start] = 0; // 起始顶点的键值为0for (int count = 0; count < n - 1; count++) {// 查找键值最小的顶点int u = -1;for (int v = 0; v < n; v++) {if (!inMST[v] && (u == -1 || key[v] < key[u])) {u = v;}}inMST[u] = 1; // 将该顶点加入最小生成树// 更新邻居的键值for (int v = 0; v < n; v++) {if (graph[u][v] && !inMST[v] && graph[u][v] < key[v]) {//注意两者区别parent[v] = u;key[v] = graph[u][v];}}}// 打印最小生成树for (int i = 1; i < n; i++) {printf("Edge: %d - %d, Weight: %d\n", parent[i], i, graph[parent[i]][i]);}
}
Dijkstra算法的C语言实现
#include <stdio.h>
#include <limits.h>#define MAX_V 100
#define INF INT_MAXint graph[MAX_V][MAX_V]; // 邻接矩阵
int key[MAX_V]; // 存储最短路径权重
int previous[MAX_V]; // 存储前驱节点
int inSPT[MAX_V]; // 标记顶点是否在最短路径树中void dijkstra(int start, int n) {for (int i = 0; i < n; i++) {key[i] = INF; // 初始化为无穷大inSPT[i] = 0; // 初始化为不在最短路径树中previous[i] = -1; // 初始化前驱节点}key[start] = 0; // 起始顶点的键值为0for (int count = 0; count < n - 1; count++) {// 查找键值最小的顶点int u = -1;for (int v = 0; v < n; v++) {if (!inSPT[v] && (u == -1 || key[v] < key[u])) {u = v;}}inSPT[u] = 1; // 将该顶点加入最短路径树// 更新邻居的键值for (int v = 0; v < n; v++) {if (graph[u][v] && !inSPT[v] && key[u] + graph[u][v] < key[v]) {//注意两者区别key[v] = key[u] + graph[u][v];previous[v] = u;}}}// 打印最短路径for (int i = 0; i < n; i++) {printf("Distance from %d to %d is %d\n", start, i, key[i]);}
}
相关文章:

Prim算法与Dijstra算法
注:参考如下文章和视频 不能说毫不相干,简直是一模一样(Prim vs Dijkstra) 普里姆和迪杰斯特拉太像了,他们有什么区别? Prim算法和Dijkstra算法区别 文章目录 总结数组元素的更新两种算法的完整代码 普里姆算法算法步骤算法描…...

水经微图IOS版5.6.1发布,新增图源二维码分享并修订徒步模式功能
随时随地,微图一下! 水经微图(以下称“微图”)IOS版5.6.1发布,本次升级主要新增了图源二维码分享功能,以及修订过往足迹的徒步模式功能。 当前版本 当前版本号为:5.6.1 如果你发现该版本中存…...

复现第三周
1.eval执行 1)打开题目 简单进行代码审计,而题目又为eval函数说明这里eval() 会执行传入的任意代码,可以通过 cmd 作为参数执行任意 PHP 代码,这里相当于用cmd作为参数来执行url头命令 2)在url头输入命令cmdsystem("ls&quo…...

Django---数据库(多表关联)
在Django中操作数据库并实现多表关联,主要是通过定义模型(Models)及其关系,然后利用Django ORM(Object-Relational Mapping)执行数据库操作。 定义模型及其关系 首先,需要在models.py文件中定…...

2024系统架构师---论软件可靠性设计及其应用论文
可靠性 软件可靠性是指软件系统在一定的时间内持续无故障运行的能力。 可靠性通常用平均失效等待时间(MTTF)和平均失效间隔时间(MTBF)来衡量。 影响可靠性的因素 从技术的角度来看,影响软件可靠性的主要因素如下。…...

SpringBoot在线教育系统:云部署策略
6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…...

Zabbix 6.0 部署
目录 一、序章 二、zabbix概念 2.1 zabbix 是什么? 2.2 zabbix 监控原理: 2.3 Zabbix 6.0 新特性: 2.3.1 Zabbix server高可用防止硬件故障或计划维护期的停机 2.3.2 Zabbix 6.0 LTS新增Kubernetes监控功能,可以在Kubernet…...

用Python遍历输出烟感名称和状态
为了使用Python遍历输出烟感名称和状态,您需要首先从SNMP代理(如网络设备或硬件设备)获取这些值。为此,您可以使用第三方库如pysnmp,它允许您轻松地与SNMP代理通信。 首先,您需要安装pysnmp库,…...

Redis的持久化以及性能管理
目录 一、Redis持久化概述 1.什么是Redis持久化 2.持久化方式 3.RDB持久化 3.1概念 3.2触发条件 3.3执行流程 3.4启动时加载 4. AOF持久化 4.1概念 4.2启动AOF 4.3执行流程 4.4启动时加载 5.RDB和AOF的优缺点 二、Redis性能管理 1.查看Redis内存使用 2…...

Docker部署Meta-Llama-3.1-70B-Instruct API openai格式,vLLM速度对比
下载模型 modelscope环境,国内下载更快: conda create -n modelscope python=3.10 conda activate modelscopepip install modelscope命令行下载: https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct modelscope download --model LLM-Research/Met…...

USB协议学习
文章目录 USB发展背景发展变化速度等级通讯接口 四种传输主设备 & 从设备主设备从设备 连接与检测高速设备与主机连接USB总线常见的几种状态 枚举过程特点 控制传输学习资料 USB发展背景 发展变化 USB1.1:规范了USB低全速传输; USB2.0:…...

TDengine 数据订阅 vs. InfluxDB 数据订阅:谁更胜一筹?
在时序数据的应用场景中,数据的实时消费和处理能力成为衡量数据库性能和可用性的重要指标。TDengine 和 InfluxDB 作为时序数据库(Time Series Database)中的佼佼者,在数据订阅方面各有特点。但从架构设计、灵活性和系统负载上看&…...

用户批评 SAP 的人工智能战略
在2024年德语SAP用户组织(DSAG)年会上,SAP用户对公司云优先的AI创新策略表示不满。SAP决定将AI功能仅限于云客户,使使用本地部署(on-premises)系统的用户感到被忽视。这种“云优先”策略引发了SAP用户间的广…...

Jest进阶知识:React组件的单元测试
在现代前端开发中,组件是构建应用程序的基本单元。一个组件不仅拥有完整的功能,还能极大地提高代码的复用性。因此,在进行单元测试时,对重要组件进行测试是必不可少的。 Testing Library Testing Library 是一个专门用于测试 We…...

MATLAB——矩阵操作
内容源于b站清风数学建模 数学建模清风老师《MATLAB教程新手入门篇》https://www.bilibili.com/video/BV1dN4y1Q7Kt/ 目录 1.MATLAB中的向量 1.1向量创建方法 1.2向量元素的引用 1.3向量元素修改和删除 2.MATLAB矩阵操作 2.1矩阵创建方法 2.2矩阵元素的引用 2.3矩阵…...

智能数据驱动的风险管理:正大金融科技的创新实践
在不断变化的金融环境中,风险管理成为投资成功的关键因素。正大公司以数据驱动的智能风控体系为核心,通过深度学习、数据分析等技术创新,帮助投资者在复杂的市场条件下实现稳健操作和风险控制。本文将探讨正大如何利用科技手段提升风险管理效…...

贝尔不等式的验证
在量子计算机上运行一个实验,以演示使用Estimator原型违反CHSH不等式。 import numpy as npfrom qiskit import QuantumCircuit from qiskit.circuit import Parameter from qiskit.quantum_info import SparsePauliOpfrom qiskit_ibm_runtime import QiskitRuntim…...

GR2——在大规模视频数据集上预训练且机器人数据上微调,随后预测动作轨迹和视频(含GR1详解)
前言 上个月的24年10.9日,我在朋友圈看到字节发了个机器人大模型GR2,立马去看了下其论文(当然了,本质是个技术报告) 那天之后,我就一直想解读这个GR2来着 然,意外来了,如此文《OmniH2O——通用灵巧且可全…...

伦敦金价格是交易所公布的吗?
今年以来,伦敦金价格波动可谓是波澜壮阔,盘中屡次刷新历史新高,目前已经冲上了2700的历史大关。面对高歌猛进的伦敦金价格,投资者除了进行交易之外,还有一点相关方面的知识是想了解的。例如,伦敦金价格是交…...

Oracle SQL Loader概念及用法
Oracle SQLLoader是Oracle数据库提供的一个高效的数据加载工具,它能够将外部数据(如CSV、DAT、Text等文件格式)快速加载到Oracle数据库中。以下是对Oracle SQLLoader的详细介绍: 一、主要功能 数据迁移:SQL*Loader常…...

ReactPress 是什么?
ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 ReactPress 是什么? ReactPress 是使用React开发的开源发布平台,用户可以在支持React和MySQL数据库的服务器上架设属于自己的博客、网站。也可以把 ReactP…...

MR30分布式IO模块与高效PLC协同
在现代工业自动化领域中,数据采集与控制系统扮演着至关重要的角色。其中,可编程逻辑控制器(PLC)和分布式IO模块(Distributed I/O Modules)是这一领域的两大核心组件。本文将详细介绍MR30分布式IO模块与PLC如…...

成都睿明智科技有限公司共赴抖音电商蓝海
在这个短视频风起云涌的时代,抖音作为现象级的社交媒体平台,不仅改变了人们的娱乐方式,更悄然间重塑了电商行业的格局。在这片充满机遇与挑战的蓝海中,成都睿明智科技有限公司凭借其敏锐的市场洞察力和专业的服务能力,…...

Android15音频进阶之音频策略加载及使用(九十一)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…...

Spring设值注入
设值注入(Setter Injection)是Spring框架中依赖注入的一种方式,通过Setter方法将依赖对象注入到目标对象中。设值注入在对象创建后,通过调用Setter方法完成依赖注入。 设值注入的优点 灵活性:设值注入允许在对象创建…...

Spring整合Mybatis过程
配置文件 springConfig --> [jdbcConfig mybatisConfig] jdbc配置文件进行基本的数据库连接池配置 mybatis配置文件进行SqlSessionFactory Bean 和 MapperScannerConfigurer Bean的创建 在Spring容器启动时,系统会根据配置创建并初始化所有MyBatis所需的Bean…...

常见HR问题篇
系列文章目录 第一章 C/C语言篇第二章 计算机网络篇第三章 操作系统篇第四章 数据库MySQL篇第五章 数据库Redis篇第六章 场景题/算法题第七篇 常见HR问题篇 本系列专栏:点击进入 后端开发面经 关注走一波 秋招阶段,面过很多大中小厂,积攒了…...

调用数据集mnist(下载+调用全攻略)
1、下载mnist数据集请自取: 通过百度网盘分享的文件:mnist 链接:https://pan.baidu.com/s/1ia3vFA73hEtWK9qU-O-4iQ?pwdmnis 提取码:mnis 下载后把数据集放在没有中文的路径下。 # 本文将下载好的数据集放在C:\DeepLearning\…...

【基础语法】Java Scanner hasNext() 和 hasNextLine() 的区别
OJ在线编程常见输入输出练习中默认模板 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.…...

react使用Fullcalendar 实战用法
使用步骤请参考:react使用Fullcalendar 卡片式的日历: 需求图: 卡片式的日历,其实我是推荐 antd的,我两个都写了一下都能实现。 antd 的代码: antd的我直接用的官网示例:antd 日历示例 i…...