当前位置:网站首页>Dijkstra求最短路
Dijkstra求最短路
2022-08-10 02:57:00 【小艾菜菜菜】
Dijkstra整体思路
该算法的真题思路比较清晰,即进行n(n 为 n 个数)次迭代去确定每个点到起点的最小值,最后输出的终点即为我们要找的最短距离。
总之,我们按照这个思路除了存储图以外,我们还需要存储两个量。
int dist[n] //用于存储每个点到起点的最短距离
bool st[n] //用于在更新最短距离时判断当前的点的最短距离是否正确,是否需要更新
每次迭代的过程中我们都线找到当前未确定的最短距离的点中,距离最短的呢个点。
(至于为什么是这样那么这就涉及到Dijkstra算法的具体数学证明了 有兴趣的同学可以百度一下)
int t = -1;
for (int i = 0; i < n ; i++ )
{
if (! st[j] && (t == -1 || dist[t] > dist[j]) t = j;
}
通过上述的操作当前我们的 t 代表就是剩余的未确定的最短路的点中,路径最短的点。
而于此同时,该点的最短路径也已经确定,因此我们该对该店进行标记
st[t] = true;
然后用这个去更新其余未确定点的最短距离。
for (int j = 1; j <= n; j++)
dist[j] = min (dist[j],dist[t] + g[t][j]);
//这里可能有同学要问j如果从1开始的话 会不会影响之前已经确定的点的最小距离
//但其实是不会 因为按照我们的Dijkstra算法的操作顺序 先确定最短距离的点的距离已经比后确定的要小 所以不会影响
//当然你也可以在循环判断条件里加上if(!st[i])
//这里j从1开始只是为了代码的简洁
进行n次迭代后最后就可以确定每个点的最短距离
然后再根据题意输出相应的 要求的最短距离
代码实现
具体落实到代码,我们通过一道题来进一步去理解
代码实现
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=510;
int g[N][N]; //为稠密阵所以用邻接矩阵存储
int dist[N]; //用于记录每一个点距离第一个点的距离
bool st[N]; //用于记录该点的最短距离是否已经确定
int n,m;
int Dijkstra()
{
memset(dist, 0x3f,sizeof dist); //初始化距离 0x3f代表无限大
dist[1]=0; //第一个点到自身的距离为0
for(int i=0;i<n;i++) //有n个点所以要进行n次 迭代
{
int t=-1; //t存储当前访问的点
for(int j=1;j<=n;j++) //这里的j代表的是从1号点开始
if(!st[j]&&(t==-1||dist[t]>dist[j]))
t=j;
st[t]=true;
for(int j=1;j<=n;j++) //依次更新每个点所到相邻的点路径值
dist[j]=min(dist[j],dist[t]+g[t][j]);
}
if(dist[n]==0x3f3f3f3f) return -1; //如果第n个点路径为无穷大即不存在最低路径
return dist[n];
}
int main()
{
cin>>n>>m;
memset(g,0x3f,sizeof g); //初始化图 因为是求最短路径
//所以每个点初始为无限大
while(m--)
{
int x,y,z;
cin>>x>>y>>z;
g[x][y]=min(g[x][y],z); //如果发生重边的情况则保留最短的一条边
}
cout<<Dijkstra()<<endl;
return 0;
}
边栏推荐
- liunx PS1 settings
- How does a new tester do functional testing?Test thinking is really important
- 实例045:求和
- Evaluation and Construction of Enterprise Network Security Capability from the Sliding Ruler Model
- 实例043:作用域、类的方法与变量
- 过水滑环的结构和工作原理
- Take you to an in-depth understanding of the version update of 3.4.2, what does it bring to users?
- 三极管开关电路参数设计与参数介绍
- 湖仓一体电商项目(四):项目数据种类与采集
- PostgreSQL相关语法及指令示例
猜你喜欢
Little rookie Hebei Unicom induction training essay
exchange2010 邮件数据库无法装入
如何编写一份优质的测试用例?
一文教会你快速上手 Vim
(面试加分新技能) 总结11个ES2022中你可能遗漏的语法
论文理解:“PIAT: Physics Informed Adversarial Training for Solving Partial Differential Equations“
uniapp 路由与页面跳转
The IDEA to automatically generate the serialVersionUID
Dynamic Web Development Fundamentals
清洁环保的小型风电滑环基本介绍
随机推荐
如何快速成为一名软件测试工程师?测试员月薪15k需要什么技术?
IDEA自动生成serialVersionUID
《天才基本法》:平行时空的第二次选择,小演员的表现意外出圈
MySQL: Introduction to Logging System | Error Log | Query Log | Binary Log: Bin-log Data Recovery Practice | Slow Log Query
驱动程序开发:按键中断之异步通知
2022/08/09 学习笔记 (day26) IO流
二维空间下的向量旋转
【红队】ATT&CK - 自启动 - 利用LSA身份验证包自启动机制
从8k到13k,我全靠这本《接口自动化测试——从入门到精通》
Kettle 裁剪表详解(truncate)
goland控制台显示重叠问题解决方案
小程序分包及分包预下载
leetcode-218.天际线问题
QT modal dialog and non-modal dialog learning
Basic understanding of network models
黑马jvm课程笔记d2
uva1392
Small program subcontracting and subcontracting pre-download
How to quickly become a software test engineer?What skills do testers need for a monthly salary of 15k?
C - The Battle of Chibi (dp加树状数组前缀和优化)