dijkstra和prim算法

最初看严蔚敏老师的《数据结构》一书时,便感觉Dijkstra (读作['daik stra])和Prim这两个算法几乎一摸一样,后来看到李清勇老师的《算法设计与问题求解》一书中对两中算法的比较,才知道两种算法的异同点。

关于Dijkstra的念法,请看如下地址说明:
https://www.cnblogs.com/daxia319/archive/2010/10/16/1853178.html

Dijkstra 算法是求连通图中起始点和每一个点之间的最短路径,而prim算法是求连通图的最小生成树,也就是生成树的最短路径之和。

假设图中所有顶点的集合为V,Dijkstra是先把起始顶点 u 0 u_0 u0加入集合S使得 S = { u 0 } S=\{u_0\} S={u0},然后从剩下的顶点集合V-S中寻找如下条件的最短的边:该边的一个顶点位于集合S,一个顶点位于集合V-S,这样一直循环直到所有的顶点V都在S中。

而Prim算法是在所有的边中寻找最短的边,同时如果该边的两个顶点都不在S中,就加入集合S,然后继续寻找其他的边,知道所有的顶点V都在集合S中。

在实现上,两者的思路基本一致,都要维护一个最短路径数组。在每次加入一个顶点后,都会计算并更新最短路径数组的每个下标值。所不同的是,Prim算法每次更新时,是将S集合中所有的顶点看作一个顶点A,计算的V-S 集合中顶点和顶点A的距离,而Dijkstra 是计算的起始点和新加入顶点的距离。

Dijkstra代码示例:

#include "dijkstra.h"#include "graph.h"//from 0
//plusint dijkstra(GRAPH * g) {int num = 0;unsigned __int64 * cost = new unsigned __int64[g->vertex];int * visit = new int[g->vertex];int* vertex = new int[g->vertex];int* v = new int[g->vertex];int idx = 0;for (int i = 0; i < g->vertex; i++) {idx = num * g->vertex + i;if (g->element[idx].e) {cost[i] = g->element[idx].e;}else {cost[i] = -1;}visit[i] = 0;vertex[i] = 0;v[i] = 0;}int pos = 1;for (num = pos; num < g->vertex; num++) {int n = 0;		//must be in circleunsigned __int64 t = 0xffffffffffffffff;	//must be in circlefor (int j = 0; j < g->vertex; j++){if (visit[j] == 0) {if (cost[j] < t) {t = cost[j];n = j;}}}//vertex[num] = n;v[num] = t;for (int k = 0; k < g->vertex; k++) {if (visit[n] == 0) {idx = n * g->vertex + k;int srcpos = num * g->vertex + k;if (g->element[idx].e && g->element[srcpos].e) {if (cost[k] > g->element[idx].e + g->element[srcpos].e) {cost[k] = g->element[idx].e + g->element[srcpos].e;vertex[k] = n;}}}}visit[n] = 1;}return 0;
}void testDijkstra() {GRAPH* g = genGraph(10,-1);dijkstra(g);return;
}

Prim代码示例:

#include "prim.h"#include "graph.h"int prim(GRAPH* g) {int num = 0;unsigned __int64* cost = new unsigned __int64[g->vertex];int* visit = new int[g->vertex];int* vertex = new int[g->vertex];int* v = new int[g->vertex];int idx = 0;for (int i = 0; i < g->vertex; i++) {idx = num * g->vertex + i;if (g->element[idx].e) {cost[i] = g->element[idx].e;}else {cost[i] = -1;}visit[i] = 0;vertex[i] = 0;v[i] = 0;}visit[0] = 1;vertex[0] = 0;v[0] = 0;int pos = 1;for (num = pos; num < g->vertex; num++) {int n = 0;		//must be in circleunsigned __int64 t = 0xffffffffffffffff;	//must be in circlefor (int j = 0; j < g->vertex; j++){if (visit[j] == 0) {if (cost[j] < t) {t = cost[j];n = j;}}}//vertex[num] = n;v[num] = t;for (int k = 0; k < g->vertex; k++) {if (visit[n] == 0) {idx = n * g->vertex + k;if (g->element[idx].e) {int srcpos = num * g->vertex + k;if (cost[k] > g->element[idx].e) {cost[k] = g->element[idx].e;vertex[k] = n;}}}}visit[n] = 1;}return 0;
}void testPrim() {GRAPH* g = genGraph(5, -1);prim(g);return;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/588013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Wireshark-win64

前言 Wireshark是使用最广泛的一款「开源抓包软件」&#xff0c;常用来检测网络问题、攻击溯源、或者分析底层通信机制。 它使用WinPCAP作为接口&#xff0c;直接与网卡进行数据报文交换。 Wireshark-win64 前言1 下载地址2 安装 1 下载地址 https://download.csdn.net/down…

k8s搭建(五、k8s可视化管理工具Dashboard配置)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

linux 网络系统管理 技能大赛 nginx fastCGI配置

WEB服务 安装 nginx 软件包 配置文件名为 ispweb.conf&#xff0c;放置在/etc/nginx/conf.d/目录下 网站根目录为/mut/crypt&#xff08;目录不存在需创建&#xff09; 启用 FastCGI 功能&#xff0c;让 nginx 能够解析 php 请求 ndex.php 内容使用 Welcome to 2022 Compu…

【mysql】数据处理是否超时、处理时长

数据处理 是否超时 -- Mysql如何计算两个时间字段的差值&#xff1f;可用函数 TIMESTAMPDIFF() -- 0否&#xff0c;1是&#xff0c;-1未知&#xff0c;“处理时限”超48小时则视为超时 select case when TIMESTAMPDIFF(HOUR, tpp.ARCHIVE_DATE,tpp.DEADLINE_TIME) > 48 t…

2023.12.30 pymysql操作

目录 1.Pymysql 1.1连接pymysql 1.2 查询数据 1.3增删改操作 2. Pymysql数据库练习 2.1 代码实现 3.数据库练习2 假设之前已有用户登录的方法&#xff0c;但是该方法没有记录日志。现在想通过装饰器来增强原有功能 1.Pymysql 总结&#xff1a; fetchall(): 获取所有查询…

【Linux】修复 Linux 错误 - 打开文件过多

修复 Linux 错误 - 打开文件过多 在使用 Linux 操作系统时,有时会遇到一个常见的错误 - "打开文件过多"。这个错误通常发生在一个进程打开了太多的文件描述符,超过了系统的限制。本文将介绍如何识别和修复这个问题。 识别问题 要识别是否出现了"打开文件过…

什么是 JavaScript 中的生成器

JavaScript中的生成器代码是一种特殊的函数&#xff0c;它可以生成迭代器对象。生成器代码通过使用yield关键字来指示生成器的状态。每次调用生成器函数时&#xff0c;它都会返回一个迭代器对象&#xff0c;该对象可以用于以惰性的方式逐步产生值。 生成器代码的语法类似于普通…

Vue: 事件修饰符, 键盘事件, 鼠标事件,计算属性

目录 事件修饰符 阻止默认事件 阻止冒泡 允许触发一次 捕获模式 self passive 键盘事件 keyup & keydown 按键别名 注意tab 注意系统按键 自定义按键 鼠标事件 简介 鼠标焦点事件 计算属性 差值语法实现 methods实现 computed实现 get() set() 总…

2023-12-18 LeetCode每日一题(寻找峰值)

2023-12-18每日一题 一、题目编号 162. 寻找峰值二、题目链接 点击跳转到题目位置 三、题目描述 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返…

acwing 离散化

AcWing 802. 区间和 离散化就是使用更少的下标来表示一部份数// 例如&#xff1a;1&#xff0c;3&#xff0c;5 // 离散化前&#xff1a;0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5 // 离散化后&#xff1a;0&#xff0c;1&#xff0c;2注意去重方法…

信号与线性系统翻转课堂笔记19——连续/离散系统的零极点与稳定性

信号与线性系统翻转课堂笔记19——连续/离散系统的零极点与稳定性 The Flipped Classroom19 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#x…

解决IDEA上传Git 带有本地编译文件问题

IDEA 版本控制推送代码问题 IDEA开发过程中&#xff0c;使用版本控制Git、Svn或其他版本管理工具提交代码到远程经常遇到一些不重要的文件。这些文件是本地的文件&#xff0c;不需要上传&#xff0c;这个时候就需要通过设置&#xff0c;来改变。 问题解决 在IDEA通过设置&…

旁挂二层隧道转发小实验

WLAN配置 旁挂二层隧道转发 1.基础配置&#xff1a; SW1: system-view vlan batch 100 to 101interface GigabitEthernet 0/0/1 port link-type trunk port trunk pvid vlan 100 //打上管理VLAN的100标签 port trunk allow-pass vlan 100 101interface GigabitEthernet 0/…

Apollo自动驾驶:从概念到现实的里程碑

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言1. Apollo Client2. Apollo Server3. Apollo Federation4. Apollo Tracing5. Apollo Codegen6. Apollo Link7. 其他工具和框架结论 &#x1f680;&#x1f…

Spring整合drools

1 Spring简单整合Drools 在项目中使用Drools时往往会跟Spring整合来使用。具体整合步骤如下&#xff1a; 第一步&#xff1a;创建maven工程drools_spring并配置pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven…

Android 13 自动旋转屏幕 重启后关闭的问题

介绍 近期在Android 13 上发现当打开自动旋转屏幕后关机&#xff0c;重新启动后自动旋转屏幕关闭了 修改 路径&#xff1a;vendor/mediatek/proprietary/frameworks/base/settingsprovider/java/com/mediatek/provider/MtkSettingsExt.java public static final String ACCEL…

Windows10系统的音频不可用,使用疑难解答后提示【 一个或多个音频服务未运行】

一、问题描述 打开电脑&#xff0c;发现电脑右下角的音频图标显示为X&#xff08;即不可用&#xff0c;无法播放声音&#xff09;&#xff0c;使用音频自带的【声音问题疑难解答】&#xff08;选中音频图标&#xff0c;点击鼠标右键&#xff0c;然后选择“声音问题疑难解答(T)”…

英飞凌TC3xx之一起认识GTM系列(五)如何实现GTM与DSADC关联的配置

英飞凌TC3xx之一起认识GTM系列(五)如何实现GTM与DSADC关联的配置 1 GTM与DSADC的连接1.1 EDSADC 到 GTM 的连接1.1.1 工作原理说明1.1.2 应用举例1.2 GTM 到 EDSADC 的连接1.2.1 工作原理说明1.2.2 应用举例2 总结编者按:笔者在从事这部分开发工作的时候,看着手册上的各种通…

17-网络安全框架及模型-信息流模型(FM)

目录 信息流模型&#xff08;FM&#xff09; 1 背景概述 2 基本概念 3 基本原理 4 应用领域 5 信息流分析方法 6 优势和局限性 7 应用场景 8 挑战和机遇 信息流模型&#xff08;FM&#xff09; 1 背景概述 在当今数字化时代&#xff0c;信息的传输和交换变得越来越重…

Git 常用命令知识笔记

Git 仓库数据结构 Git 仓库由一个个的 commit 组成某些 commit 上会有一些 branch 指向它们&#xff0c;这些 branch 的本质是引用有一个特殊的引用叫做 HEAD&#xff0c;它始终指向当前的位置&#xff0c;这个位置可以是 commit&#xff0c;也可以是 branch staging area 暂存…