【数据结构】最短路径(Dijskra算法)

一.引例

计算机网络传输的问题:

怎样找到一种最经济的方式,从一台计算机向网上所有其他计算机发送一条消息。

抽象为:

给定带权有向图G=(V,E)和源点v,求从v到G中其余各顶点的最短路径。

即:

单源点最短路径问题

给定带权有向图G=(V,E)和源点v$\in$V,求从v到G中其余各顶点的最短路径。

二.最短路径

在非网图中,最短路径是指两顶点之间经历的边数最少的路径。

在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径。

三.Dijskra算法的基本思想

        设置一个集合S存放已经找到最短路径的顶点,S的初始状态只包含源点v,对vi属于V-S,假设从原点v到vi的有向边为最短路径。以后每求得一条最短路径v,……,vk,就将vk加入到集合S中,并将路径v,……,vk,vi与原来的假设相比较,取路径长度较小者为最短路径。重复上述过程,直到集合V中全部顶点加入到集合S中。

四.Dijskra算法的数据结构

1.图的存储结构:

带权的邻接矩阵存储结构(因为需要频繁的读取边)

2.数组dist[n]:

每个分量dist[i]表示当前所找到的从起始点v到终点vi的最短路径的长度。

初态为:若从v到vi有弧,则dist[i]为弧上权值;否则置dist[i]为$\infty$

3.数组path[n]:

path数组,下标为图每个顶点的编号,数组中的元素为由某个顶点到这个顶点的顶点编号。

初态为:若从v到vi有弧,则path[i]为0;否则path[i]为-1。

最终输出最短路径,依靠path数组。

每次更改dist数组的内容,都会在path数组中更新上一个结点的内容。

4.数组s[n]:

存放源点和已生成的终点,其初态为只有一个源点v。

s数组都初始化为0(源点初始化为1),当该点被放入s集合中,将其置为1。

 五.伪代码

1.初始化数组dist、path和s;

2.while(s中的元素个数<n)

        2.1 在dist[n]中求最小值,其下标为k;

        2.2 输出dist[i]和path[j];

        2.3 修改数组dist和path;

        2.4 将顶点vk添加到数组s中

六.代码实现 

#include <iostream>using namespace std;const int MAX_VERTEX=10;//带权(邻接矩阵)有向图
class MGraph{
private:int arc[MAX_VERTEX][MAX_VERTEX];//邻接矩阵int vertex[MAX_VERTEX];//存储每个结点的信息int vertexNum,arcNum;//实际顶点个数,边的条数
public:MGraph(int n,int e);void Dijkstra(int start);int findMinDist(int dist[],int s[]);void display();void displayPath(int dist[],int path[],int start,int min);
};int main(int argc, const char * argv[]) {MGraph G(5, 7);//G.display();G.Dijkstra(0);return 0;
}
MGraph::MGraph(int n,int e){int p,q,w;vertexNum=n;arcNum=e;for(int i=0;i<n;i++){//初始化邻接矩阵for(int j=0;j<n;j++){arc[i][j]=-1;//-1表示不可到达}}for(int i=0;i<n;i++){vertex[i]=i;arc[i][i]=0;}for(int i=0;i<e;i++){cin>>p>>q>>w;arc[p][q]=w;}
}void MGraph::Dijkstra(int start){int *s=new int[vertexNum];int *dist=new int[vertexNum];int *path=new int[vertexNum];int i,num=0,min;for(i=0;i<vertexNum;i++){dist[i]=arc[start][i];//初始化距离s[i]=0;//初始化集合Sif(arc[start][i]!=-1){//start到i有路径path[i]=start;}else{path[i]=-1;}}s[start]=1;//将源点放入集合S中,1表示在集合中,0表示不在集合中num++;//num记录集合S中元素的个数
//    for(int i=0;i<vertexNum;i++){
//        cout<<dist[i]<<" ";
//    }
//    cout<<endl;while(num<vertexNum){min=findMinDist(dist, s);//dist中查找集合S中不存在的顶点到源点的距离的最小值cout<<min<<endl;s[min]=1;//将新生成的终点加入到集合S中num++;for(i=0;i<vertexNum;i++){//更新数组dist和pathif(s[i]==0&&arc[min][i]!=-1){if(dist[i]==-1){dist[i]=dist[min]+arc[min][i];//更新dist数组path[i]=min;//更新path数组}else if(dist[i]!=-1&&(dist[min]+arc[min][i])<dist[i]){dist[i]=dist[min]+arc[min][i];path[i]=min;//更新path数组}}}
//        for(int i=0;i<vertexNum;i++){
//            cout<<dist[i]<<" ";
//        }
//        cout<<endl;displayPath(dist, path, start, min);}delete [] path;delete [] s;delete [] dist;
}int MGraph::findMinDist(int dist[],int s[]){int i=0,min=0;for(i=0;i<vertexNum;i++){//给min赋初始值if(s[i]==0&&dist[i]!=-1){//该顶点不在集合S中min=i;break;}}for(;i<vertexNum;i++){if(s[i]==0){//该顶点不在集合S中if(dist[i]!=-1&&dist[min]>dist[i]){min=i;}}}return min;
}void MGraph::displayPath(int dist[],int path[],int start,int min){int pre=min;int p[vertexNum],i=0,j;while(pre!=start){p[i++]=pre;pre=path[pre];}p[i++]=pre;cout<<"(";for(j=i-1;j>0;j--){cout<<p[j]<<",";}cout<<p[0]<<")";cout<<dist[min]<<endl;
}
void MGraph::display(){for(int i=0;i<vertexNum;i++){for(int j=0;j<vertexNum;j++){cout<<arc[i][j]<<" ";}cout<<endl;}
}

 

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

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

相关文章

【C语言】【字符串函数的模拟实现】strcpy,strcat,strcmp,strncpy,strncat,strstr

1.strcpy char* strcpy(char*destination,const char* source)源字符串必须以’\0’结尾会将原字符串中的‘\0’拷贝到目标字符串中目标空间必须足够大&#xff0c;能放得下源字符串 模拟实现&#xff1a; char *my_strcpy(char* des,const char *sour) {char* retdes;asser…

【开源存储】minio对象存储部署实践

文章目录 一、前言1、介绍说明2、部署方式3、冗余模式4、约束限制4.1、规格参数4.2、API支持a、minio不支持的Amazon S3 Bucket APIb、minio不支持的Amazon S3 Object API 二、部署说明1、软件安装2、minio单机部署3、minio分布式部署3.1、前置条件3.2、开始运行3.3、操作说明 …

【面试经典 150 | 二分查找】搜索插入位置

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;二分查找闭区间左闭右开区间开区间总结 知识总结写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c…

CAP BASE理论

CAP & BASE理论详解 CAP 理论 简介 CAP 也就是 Consistency&#xff08;一致性&#xff09;、Availability&#xff08;可用性&#xff09;、Partition Tolerance&#xff08;分区容错性&#xff09; 这三个单词首字母组合。 CAP 理论的提出者布鲁尔在提出 CAP 猜想的时…

VMware17 下载、安装、成功安装效果、完整卸载

VMware17 下载、安装、卸载 下载 VMware17 安装 更改安装路径 去掉这两个复选框&#xff0c;点击安装。 安装结束&#xff0c;点击许可证。 输入序列号&#xff0c;点击【输入】 序列号&#xff1a;MC60H-DWHD5-H80U9-6V85M-8280D 点击完成 测试安装效果 永不过期&am…

Hdoop学习笔记(HDP)-Part.06 安装OracleJDK

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

RocketMQ(四):重复消费、消息重试、死信消息的解决方案

RocketMQ系列文章 RocketMQ(一)&#xff1a;基本概念和环境搭建 RocketMQ(二)&#xff1a;原生API快速入门 RocketMQ(三)&#xff1a;集成SpringBoot RocketMQ(四)&#xff1a;重复消费、消息重试、死信消息的解决方案 目录 一、重复消费1、消息重复的情况2、MySql唯一索引…

Docker Compose及Docker 知识点整理

目录 1、Docker Compose 简介 2、为什么要使用Docker Compose 3、Docker Compose安装使用&#xff08;Linux&#xff09; 3.1 下载 3.2 mkdir docker 文件夹目录 3.3 上传docker-compose到docker文件夹 3.4 移动到 /usr/local/bin 目录下 3.5 添加执行权限 3.6 修改文…

华为云之快速部署FTP站点

华为云之快速部署FTP站点 一、本次实践介绍1.1 实践环境简介1.2 本次实践目的 二、vsftpd介绍2.1 vsftpd简介2.2 vsftpd特点 三、环境准备工作3.1 预置实验环境3.2 查看预置环境信息3.3 登录华为云3.4 查看弹性云服务器状态3.5 查看弹性公网IP地址3.6 ssh登录弹性云服务器3.6 查…

基于c#+mysql+winform学生成绩管理系统-实践作业

基于c#mysqlwinform学生成绩管理系统-实践作业 一、系统介绍二、功能展示四、其它1.其他系统实现五.获取源码 一、系统介绍 分老师与学生两个界面&#xff1b; 老师能查看学生信息并评价&#xff0c;添加&#xff0c;删除学生&#xff1b; 老师能查看学生成绩并修改&#xff0…

整数分频,奇偶分频。

实验目标&#xff1a; 实现任意整数奇偶分频。 /* 二分频电路就是用同一个时钟信号通过一定的电路结构转变成不同频率的时钟信号。 二分频就是通过有分频作用的电路结构&#xff0c;在时钟每触发2个周期时&#xff0c;电路输出1个周期信号。 比如用一个脉冲时钟触发一个计…

Kubernetes入门学习(上)

文章目录 Kubernetes入门学习&#xff08;上&#xff09;介绍云原生 Kubernetes架构基础概念Kubernetes架构控制平面组件Node组件 组件关系 安装Kubernetes基本对象和操作Pod&#xff08;容器集&#xff09;Deployment(部署)与ReplicaSet(副本集)Service&#xff08;服务&#…

第一百八十七回 DropdownButton组件

文章目录 1. 概念介绍2. 使用方法2.1 DropdownButton2.2 DropdownMenuItem 3. 示例代码4. 内容总结5. 经验分享 我们在 上一章回中介绍了"DropdownMenu组件"相关的内容&#xff0c;本章回中将介绍 DropdownButton组件.闲话休提&#xff0c;让我们一起Talk Flutter吧…

使用 kubeadm 部署 Kubernetes 集群(三)kubeadm 初始化 k8s 证书过期解决方案

一、延长k8s证书时间 查看 apiserver 证书有效时间&#xff1a;默认是一年的有效期 [rootxuegod63 ~]# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep Not 延长证书过期时间 1.把 update-kubeadm-cert.sh 文件上传到 xuegod63 节点 vim update-…

Unity 下载网络图片的方法,并把图片赋值给UI和物体的方法

Unity 下载网络图片的方法&#xff0c;可使用WWW类或UnityWebRequest类&#xff0c;其中UnityWebRequest是新版的方法。 通常我们下载图片都会转成Texture&#xff0c;然后赋值给UI或者物体。 具体实现方法&#xff1a; using System.Collections; using System.Collections…

深入理解贝叶斯分类与朴素贝叶斯模型(Naive Bayes, NB):从基础到实战

目录 贝叶斯分类 公式 决策规则 优点 贝叶斯分类器的例子——垃圾邮件问题 1. 特征&#xff08;输入&#xff09;&#xff1a; 2. 类别&#xff1a; 3. 数据&#xff1a; 4. 模型训练&#xff1a; 注&#xff1a;类别先验概率 5. 模型预测&#xff1a; 朴素贝叶斯模…

【开题报告】基于深度学习的驾驶员危险行为检测系统

研究的目的、意义及国内外发展概况 研究的目的、意义&#xff1a;我国每年的交通事故绝对数量是一个十分巨大的数字&#xff0c;造成了巨大的死亡人数和经济损失。而造成交通事故的一个很重要原因就是驾驶员的各种危险驾驶操作行为。如果道路驾驶员的驾驶行为能够得到有效识别…

并行和并发的区别

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1、并发2、并行3、异同点 1、并发 当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程&#xff0c;它只能把CPU运行时间划分成若…

基于SpringBoot的企业客户管理系统的设计与实现

摘 要 本论文主要论述了如何使用JAVA语言开发一个企业客户管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述企业客户管理系统的当前背景以及系统开发的目…

npm ERR! notarget No matching version found for @eslint/eslintrc@^2.1.4.

文章目录 Intro解决流程总结前置信息了解npm 镜像源三个要用到的npm命令 官方源确认查看当前镜像源的详情解决&#xff1a; 切换镜像源后重试重新操作 事后感受 Intro 事由是今天我在用 create-react-app 新建一个用于测试的前端项目。 然后就出现以下报错&#xff1a; wuyuj…