前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >dijkstra算法详解—简单易懂[通俗易懂]

dijkstra算法详解—简单易懂[通俗易懂]

作者头像
全栈程序员站长
发布于 2022-11-01 03:59:43
发布于 2022-11-01 03:59:43
3.3K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

文章目录

1 简介

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。这是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止PS:此算法不能用于求负权图,要求所有边的权重都为非负值。

2 算法思想与原理

dijkstra算法思想是基于贪心算法思想的。所谓贪心算法即始终保持当前迭代解为当前最优解。意思就是在已知的条件下或是当前拥有的全部条件下保证最优解,若在此后的迭代中由于加入了新的条件使得产生了更优解则替代此前的最优解。通过不断的迭代不断保证每次迭代的结果都是当前最优解,那么当迭代到最后一轮时得到的就会是全局最优解。 由于下一轮迭代会参考上一轮的最优解,因此每一轮的迭代的工作量基本一致,降低了整体工作的复杂性。

在最短路径的问题中,局部最优解即当前的最短路径或者说是在当前的已知条件下起点到其余各点的最短距离。关键就在于已知条件,这也是Dijkstra算法最精妙的地方。我们来解释一下。

对于Dijkstra算法,我们假设初始集合(也就是初始条件)不存在任何顶点的,即所有顶点之间是不存在任何路径的,即我们认为所有顶点之间的距离都是无穷大。那么开始加入新的条件,因为我们已知源点距源点距离最小,所以加入进去,并加入它的边,在该条件下,更新该源点到其余顶点的最短距离,选出没有加入到已知集合的距源点距离最小的点,此点最短距离也被确定了(因为其他路径都比这条路径大,无法通过其他路径间接到达这个顶点使得路径更小),然后加入该点与其余还未加入已知条件顶点的边,并以该点迭代刷新最短距离。再重复以上操作,直至所有顶点都加入已知条件集合。

3 具体步骤

  1. 选择起点start与终点end;
  2. 所有点除起点外加入未知集合,并将起点加入已知集合,即至标志位为真,意为已确定该点到源点的最短路径;
  3. 初始化计算,更新起点与其他各点的耗费dis(start,n);
  4. 在未知集合中,选择dis(start,n)中值最小的点x,将x加入已知集合。
  5. 对于剩余顶点中,计算dis(start,n)>dis(start,x)+dis(x,n) 若真则dis(start,n)=dis(start,x)+dis(x,n),此时start与n点路径经过x点。循环直至goal点加入已知列表,取得dis(start,goal)即为最短距离。

4 动态展示

5 代码实现(以邻接矩阵为例)

5.1 基本数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int inf=0x3f3f3f3f; //代表无穷大。
const int maxn=100;//最大顶点数
int n,m;//n个顶点,m条边。
bool visited[maxn];//判断是否确定到源点的最终最短距离。
int graph[maxn][maxn];//带权图
int dis[maxn];//顶点到源点的最短距离。
int start,goal;//起点与目标点。

Jetbrains全家桶1年46,售后保障稳定

5.2 初始化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void init(){ 
   
	memset(visited,false,sizeof(visited));
	for(int i=1;i<=n;i++){ 
   
		dis[i]=graph[start][i];//初始化dis数组。
	}
}

5.3 dijkstra算法核心

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void dijkstra(){ 

//源点为源点start。
int minn;//记录每趟最短路径中最小的路径值。 
int pos;//记录得到的minn所对应的下标。
init();//调用初始化函数。
visited[start]=true;
for(int i=1;i<=n;i++){ 

//将n个顶点依次加入判断。
minn=inf;
for(int j=1;j<=n;j++){ 

if(!visited[j]&&dis[j]<minn){ 

minn=dis[j];
pos=j;
}
}
//经过这趟for循环后我们找到的就是我们想要的点,可以确定这点到源点的最终最短距离了。
visited[pos]=true;//我们将此点并入已知集合。
//接下来就是更新dis数组了,也就是当前最短距离,这都是针对还没有并入已知集合的点。
for(int j=1;j<=n;j++){ 

if(!visited[j]&&dis[j]>dis[pos]+graph[pos][j])
dis[j]=dis[pos]+graph[pos][j];
}
}
//退出循环后,所有的点都已并入已知集合中,得到的dis数组也就是最终最短距离了。
cout<<dis[goal]<<endl;//输出目标点到源点的最短路径长度。
}

5.4 主函数与头文件等

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<bits/stdc++.h>
using namespace std;
int main()
{ 

while(cin>>n>>m){ 

memset(graph,inf,sizeof(graph));
int u,v,w;
for(int i=0;i<m;i++){ 

cin>>u>>v>>w;
// graph[u][v]=w;//有向图
graph[u][v]=graph[v][u]=w;//无向图
}
cin>>start>>goal;//输入起点与终点。
dijkstra();
}
return 0;
}

6 拓展

如果你学会了dijkstra,那恭喜你成功突破了一关。但是,没有优化的dijkstra算法时间复杂度为 O ( n 2 ) O(n^2) O(n2),如果顶点很多边很少呢等等卡邻接矩阵的题,那么建议你还是要学一下dijkstra的优化版了。详情点击:Dijkstra算法优化~~你一定可以看懂的四种进阶优化

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/203541.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
ES6模块化开发计算器小案例续
爱学习的前端歌谣
2023/11/16
1700
ES6模块化开发计算器小案例续
ES5计算器小案例
我是歌谣 最好的种树是十年前 其次是现在 今天继续给大家带来的是ES5计算器小案例的深入讲解
爱学习的前端歌谣
2023/11/11
1700
ES5计算器小案例
React多页面应用1(​webpack开发环境搭建,包括Babel、热更新等)
本教程总共7篇,每日更新一篇,请关注我们,敬请期待! 1.React多页面应用1(webpack开发环境搭建,包括Babel、热更新等) ----2017.12.28 2.React多页面应用2(处理CSS及图片,引入postCSS及图片处理等)----2017.12.29 3.React多页面应用3(webpack性能提升,包括打包性能、提取公共包等)----2017.12.30 4.React多页面应用4(webpack自动化生成多入口页面)----2017.12.31 5.React多页面应用5(
前端人人
2018/04/11
1K0
React多页面应用1(​webpack开发环境搭建,包括Babel、热更新等)
JS ES6 模块化开发入门
type="module" 表示使用模块化, ./module/1.js 中的 ./ 不能省略
很酷的站长
2022/12/30
5860
JS ES6  模块化开发入门
请简述什么是Vue组件化开发_vue组件化开发
真实项目开发过程中,我们都是使用组件化的去开发vue的项目,但是组件化的思想又是如何来的呢?下面就从开始讲解演变过程
全栈程序员站长
2022/09/19
5530
请简述什么是Vue组件化开发_vue组件化开发
关于原始typescript实现todolist笔记(装饰器模式)
我是歌谣 最好的种树是十年前 其次是现在 今天继续给大家带来的是原始typescript的讲解
爱学习的前端歌谣
2023/10/19
2480
关于原始typescript实现todolist笔记(装饰器模式)
webpack 基础知识整理
webpack是一个 模块打包工具,支持所有的打包语法,比如 ES Module、CommonJS、CMD、AMD。初期的webpack是用来模块打包js的,发展到现在,已经可以打包很多种文件类型,比如 css、img 。
神葳
2021/01/22
1.4K0
VUE基本介绍
<script> new Vue({ data:{//定义变量初始值 //定义变量 userlist:[] }, created(){//调用定义方法 this.getUserList() }, methods:{//编写具体方法 getUserList(){ axios.get("http://xxxx") .then(//请求成功执行 response=>{ //箭头函数 //response 就是返回的数据 this.userList= response.data } ) .catch(同上)//请求失败 } } }) </script>
Dean0731
2020/05/28
7620
Vue2.0组件写法
vue2.0组件是一个vue文件 其中 <template lang="html">表示组件的html <script>组件的vue对象 <style lang="css">组件的样式文件 如下例实现父子组件通信
切图仔
2022/09/08
2900
Vue2.0组件写法
ES6模块化探究tab切换
我是歌谣 最好的种树是十年前 其次是现在 今天继续给大家带来的是探究tab切换的讲解
爱学习的前端歌谣
2023/11/20
1540
ES6模块化探究tab切换
前端模块化开发--Node基础&&WebPack模块化开发
一、Node 开发 1、模块化开发 定义统一的方法:function.js javascript exports.sum = function sum(a, b) { return a + b; } 导入方法:use.js javascript var fun = require('./function') console.log(fun.sum(1, 2)) 2、服务器 javascript //创建服务器 var http = require('http'); http.createServer
MiChong
2020/09/24
9450
前端模块化开发--Node基础&&WebPack模块化开发
Vue学习-Webpack
从本质上来讲,webpack是一个现代的JavaScript应用的静态模块打包工具。
花猪
2022/02/17
1.3K0
Vue学习-Webpack
React 折腾记 - (5) 记录用React开发项目过程遇到的问题(Webpack4/React16/antd等)
技术栈: react@16.6.0/ react-router-dom@v4 / webpack^4.23.1(babel7+)
CRPER
2018/12/05
1.6K0
React 折腾记 - (5) 记录用React开发项目过程遇到的问题(Webpack4/React16/antd等)
React多页面应用3(webpack性能提升,包括打包性能、提取公共包等)
本教程总共7篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1.React多页面应用1(webpack开发环境搭建,包括Babel、热更新等) ----2017.12.28 2.React多页面应用2(处理CSS及图片,引入postCSS及图片处理等)----2017.12.29 3.React多页面应用3(webpack性能提升,包括打包性能、提取公共包等)----2017.12.30 4.React多页面应用4(webpack自动化生成多入口页面)----201
前端人人
2018/04/11
1.8K1
React多页面应用3(webpack性能提升,包括打包性能、提取公共包等)
第四十八期:webpack的四个小技巧
思考这样一个问题,你对webapack究竟了解多少?大部分时间我们忙于业务开发,很少去思考这个问题,项目已经配置好了,我们只管开发就好了,陷入业务开发中,就没有时间去思考别的问题,这是一个普遍现象。
terrence386
2022/07/15
3620
React多页面应用2(处理CSS及图片,引入postCSS,及图片处理等)
本教程总共7篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1.React多页面应用1(webpack开发环境搭建,包括Babel、热更新等) ----2017.12.28 2.React多页面应用2(处理CSS及图片,引入postCSS及图片处理等)----2017.12.29 3.React多页面应用3(webpack性能提升,包括打包性能、提取公共包等)----2017.12.30 4.React多页面应用4(webpack自动化生成多入口页面)----201
前端人人
2018/04/11
9940
React多页面应用2(处理CSS及图片,引入postCSS,及图片处理等)
React多页面应用4(webpack4 提取第三方包及公共组件)
本教程总共9篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1、React多页面应用1(webpack4 开发环境搭建,包括热更新,api转发等)---2018.04.04 2、React多页面应用2(webpack4 处理CSS及图片,引入postCSS,及图片处理等)---2018.04.08 3、React多页面应用3(webpack4 多页面实现)---2018.04.09 4、React多页面应用4(webpack4 提取第三方包及公共组件)---2018
前端人人
2018/04/11
1.9K0
React多页面应用4(webpack4 提取第三方包及公共组件)
React多页面应用2(webpack4 处理CSS及图片,引入postCSS,及图片处理等)
本教程总共9篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1、React多页面应用1(webpack4 开发环境搭建,包括热更新,api转发等)---2018.04.04 2、React多页面应用2(webpack4 处理CSS及图片,引入postCSS,及图片处理等)---2018.04.08 3、React多页面应用3(webpack4 多页面实现)---2018.04.09 4、React多页面应用4(webpack4 提取第三方包及公共组件)---2018
前端人人
2018/04/11
1.4K0
React多页面应用2(webpack4 处理CSS及图片,引入postCSS,及图片处理等)
Webpack搭建ES6开发环境(部分摘自网络)
首先要有node环境,进入Node.js的官网,选择对应系统下载安装包。安装node后集成了npm管理器
江一铭
2022/07/05
2890
webpack 4 的 30 个步骤打造优化到极致的 react 开发环境
将 react 和 webpack4 进行结合,集 webpack 的优势于一身,从 0 开始构建一个强大的 react 开发环境。
夜尽天明
2019/06/18
2.4K0
相关推荐
ES6模块化开发计算器小案例续
更多 >
LV.1
量化类主流自媒体新媒体运营
目录
  • 文章目录
  • 1 简介
  • 2 算法思想与原理
  • 3 具体步骤
  • 4 动态展示
  • 5 代码实现(以邻接矩阵为例)
    • 5.1 基本数据
    • 5.2 初始化
    • 5.3 dijkstra算法核心
    • 5.4 主函数与头文件等
  • 6 拓展
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档