最短路 Dijkstra 算法详解与模板
转载请注明出处https://blog.csdn.net/bestsort
Dijkstra 使用的是贪心的思想,先假设所有顶点之间都没有边相连,然后每次从输入的边中选取一条权值最小的边并连接该边所对应的两个顶点,直到最后所有的顶点都被连通为止(即所有的顶点都能通过某一路径走到指定的点),如下图;
以顶点(1)为起点,点(1)连通有(6),(3),(2)三个点,权值分别为14,9,7(其他点赋值为无穷大);
所以选择权值最小的7,并连接(1,2)这条边(这里是通过并查集把两个点并入同一个祖先实现的)
然后再次遍历存权值的数组,找出下一个没被使用过且权值最小的边,并入集合中,这样一直循环n-1次,遍历了n-1个顶点之后,dis[j]就为从起点a->j的最短距离。
算法时间复杂度为O(n^2) (可以用堆或者优先队列优化达到更低的时间复杂度,可是我不会= =.....)
GIF图解如下:
所以每次需要执行的就是-
->找一条没有被标记且权值最小的边
->将该边所连的顶点标记
->将记录距离的数组更新
->重复第一步
需要注意的是,一开始设距离为无穷大,如果一圈找完后还是存在距离=无穷大,那么说明剩下的顶点与集合内的顶点均不连通.
再附一张Dijkstra算法应用的示意图(wiki盗的~)
起点以左下角的红点
目标是右上角的绿点
中间灰色的倒L型为障碍物
蓝色空圈表示"暂定",用以搜索下一步;已经填充颜色的表示探访过,图中颜色以红到绿,越绿表示离起点越远。所有节点都被均匀的探索。
代码初学时可能看着比较难以理解,但是自己试着抄一下,每一行每一行的看下来会发现还是很好理解的
以下是代码模板
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define mem(a,b) memset(a,b,sizeof(a))
#define For(a,b) for(int a=0;a<b;a++)
using namespace std;
const int maxn = 1020;
const int INF = 0x3f3f3f3f;
const int inf = 0x3f;
typedef long long ll;
int n,m; int dis[maxn]; ///a到各点的距离
bool used[maxn]; ///标记该点是否已经使用
int pre[maxn]; ///最短路经过的路径int map[maxn][maxn];
void dijkstra(int a){mem(used,0);for(int i=1;i<=n;i++){dis[i] = map[a][i];pre[i] = (dis[i]==INF)?-1:a;}dis[a] = 0;used[a] = true;for(int i=1;i<=n;i++){int Min = INF,Np = a;for(int j=1;j<=n;j++)if(!used[j] && dis[j] <Min){Np = j;Min = dis[j];}if(Np == a)return;used[Np] = true;for(int j=1;j<=n;j++)if(dis[j] > (dis[Np]+map[Np][j])){dis[j] = dis[Np]+map[Np][j];pre[j] = Np;}}
}
int main()
{int a,b,c;while(cin >> n>>m){For(i,m){cin >> a >> b >> c;map[a][b] = map[b][a] = min(map[a][b],c);}dijkstra(1);cout << (dis[n]==INF?-1:dis[n]) << endl; ///1->n的最短路}return 0;
}
转载于:https://www.cnblogs.com/bestsort/p/10588875.html
最短路 Dijkstra 算法详解与模板相关推荐
- 图论-最短路Dijkstra算法详解超详 有图解
整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...
- 最短路dijkstra算法详解_最短路径问题---Dijkstra算法详解
1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...
- 最短路dijkstra算法详解_图论系列开始填坑--Dijkstra,单源最短路
暑假只有最开始的几天最有意思,考完试玩了几天就感觉到了无聊.抱着想要出去走走的心态,我制定了一个出行路线图,我在1号城市,想去看一看2,3,4,5号城市(每去一个城市都从1号城市出发),一切准备就绪, ...
- Dijkstra算法详解(完美图解、趣学算法)
Dijkstra算法详解 Dijkstra算法设计 Dijkstra算法简介 Dijkstra算法的基本思想 Dijkstra贪心策略 完美图解 伪代码详解 完整代码 算法解析及优化拓展 使用优先队列 ...
- 迪杰斯特拉(Dijkstra)算法详解
迪杰斯特拉(Dijkstra)算法详解 在讲解迪杰斯特拉算法之前先讲解一下什么是最短路径: [图一] 假如我要求从A点到D点的最短路径,我们用肉眼可以很快速找出A–>C–>E–>D就 ...
- Dijkstra算法详解
什么是Dijkstra算法 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又 叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最 短 ...
- dijkstra 算法_最短路径问题Dijkstra算法详解
1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...
- dijkstra算法详解—简单易懂
文章目录 1 简介 2 算法思想与原理 3 具体步骤 4 动态展示 5 代码实现(以邻接矩阵为例) 5.1 基本数据 5.2 初始化 5.3 dijkstra算法核心 5.4 主函数与头文件等 6 拓 ...
- 解决最短路径的Dijkstra算法详解,附加Java代码
1. 最短路径问题 最短路径问题是生活中经常碰到的一类问题,如机器人路径规划,数学竞赛以及真实的工程施工问题:甚至是我们程序员笔试必刷算法题.其实问题很简单,就是有很多个节点,我们要计算出一个初始点到 ...
- 最短路径问题 --- Dijkstra算法详解
最短路径问题 最短路径问题 1.最短路径问题介绍 2.Dijkstra 算法思路 3.Dijkstra算法示例演示 4.Dijkstra算法的代码实现(c++) 参考 最短路径问题 1.最短路径问题介 ...
最新文章
- 抓取网页的脚本 【修复】
- linux必会命令 - 后台运行程序 - nohup、
- 1个不为人知的 Jupyter notebook 使用技巧,今天分享出来。
- 关于mysql中select出数据未排序问题
- 图:活动现场双屏管理系统V3-多线程抽奖版软件,完美升级收工!历时3个月,艰辛坎坷...
- IIS安装和ASP.NET Web应用程序开发期间部署到IIS自定义主机域名并附加进程调试...
- Python 绘制正多边形
- Android 仿火萤视频桌面 神奇的LiveWallPaper
- 学简单python好学吗_python好学吗语法简单吗举个例子
- 注意|莫让“爬虫”变“害虫”
- Android 自定义控件之画篮球
- GitHub Pages部署vuepress报错:JavaScript heap out of memory
- 网站压力测试工具was
- 【多目标优化】1. 多目标优化的相关基本概念
- 最新notion enhancer安装教程(macOS Intel适用)
- 学习前端怎么样?优势有哪些
- 1w存银行一年多少利息_500万、1000万存银行一年有多少钱利息?能靠利息生活吗?...
- 在提示框中:双击浏览器缩放,浓咖啡小睡和Android引导屏幕
- nginx防止恶意域名解析与反代80与443端口完整版
- 用Cocos2d-JS制作类神经猫的游戏《你是我的小羊驼》 转载
热门文章
- Linux复习-vi编辑器
- 文本数据增强(data augmentation)nlpaug使用
- php 非聚集锁引,sql数据库聚集索引和非聚集索引示例
- 清华大学操作系统OS学习(九)——页面置环算法:最优算法、先进先出算法(FIFO)、最近最久未使用算法(LRU)、 CLOCK法、最不常用算法(LFU) 、工作集置换算法、缺页率置环算法
- 连接spark集群Windows环境搭建
- param.requires_grad = False
- 基于sklearn分析特征工程(特征预处理、特征选择、降维)
- Linux下Python3.6安装实践与相关问题解决记录
- Python基于 ImageAI 模块实践 idenprof数据集识别预测分析
- Markdown编辑器初步使用