话不多说,先看图

1.1 朴素版的Dijkstra算法

一般用到这个情况稠密图,也就是节点的个数比边的个数少。 (稠密图用邻接矩阵存储)

#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; const int N = 510; int n, m;
int g[N][N];//稠密图用邻接矩阵,g[a][b] 表示从a点到b点的距离
int dist[N];//用于存储每个店到起点的最小距离
bool st[N];//用于在更新最短距离时,判断当前点的最短距离是否确定,是否需要更新 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; for(int j = 1; j<=n; j++)
dist[j] = min(dist[j], dist[t] + g[t][j]); st[t] = true; } if(dist[n] == 0x3f3f3f3f) return -1;
return dist[n];
} int main(){
scanf("%d%d", &n, &m); memset(g, 0x3f, sizeof g);//初始化距离 while(m--){
int a, b, c;
scanf("%d%d%d", &a, &b, &c); g[a][b] = min(g[a][b], c);//和之前a点到b点的最小距离进行比较,取两个中的最小值
} printf("%d\n", dijkstra()); return 0;
}

2.2 堆优化版的Dijkstra算法

用到这种情况的是稀疏图。 (点多边的数目少)

思路:

1 号点为例,判断一下1号点到源点的最短距离是不是已经确定了, 如果已经确定了, 跳出本次循环。如果还没有确定,厕把他的 st[1] = true , 这里思考一下我们为什么把1号点的状态改为 true, 因为所有指向1 号点的点最短距离已经确定, 自然 1 号点的最短距离也就确定了, 接下来遍历一下1号点所有指向的点 更新 1 号点指向的点的最短距离 ,

#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue> using namespace std; typedef pair<int, int> PII; const int N = 1e6 + 10; int n, m;
int h[N], w[N], e[N], ne[N], idx;
int dist[N];
bool st[N]; void add(int a, int b, int c)
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
} int dijkstra(){
memset(dist, 0x3f, sizeof dist); 初始化所有点到源点的距离为 无穷大
dist[1] = 0; // 1 号点就是源点, 所有到自身的距离是 0
priority_queue<PII, vector<PII>, greater<PII>> heap; //小根堆
heap.push({0, 1}); // 距离源点最近的点入堆 while(heap.size()) // 堆不空
{
auto t = heap.top();
heap.pop(); int var = t.second; //取到 还没有确定到源点的最短距离的点中 到源点距离最近的点 if(st[var]) continue; //判断一下该点到源点的距离是否已经确定, 如果确定跳出本次循环
st[var] = true; for(int i = h[var]; i != -1; i = ne[i])//遍历一下var 所有指向的点
{
int j = e[i];
if(dist[j] > dist[var] + w[i])
{
dist[j] = dist[var] + w[i];
heap.push({dist[j], j});
}
}
} if(dist[n] == 0x3f3f3f3f) return -1;
return dist[n];
} int main(){
scanf("%d%d", &n, &m); memset(h, -1, sizeof h); while(m--){
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
add(a, b, c);
} printf("%d\n", dijkstra()); return 0;
}

用 Dijkstra 算法解决最短路问题的更多相关文章

  1. dijkstra算法解决单源最短路问题

    简介 最近这段时间刚好做了最短路问题的算法报告,因此对dijkstra算法也有了更深的理解,下面和大家分享一下我的学习过程. 前言 呃呃呃,听起来也没那么难,其实,真的没那么难,只要弄清楚思路就很容易 ...

  2. Dijkstra算法解决单源最短路径

    单源最短路径问题:给定一个带权有向图 G = (V, E), 其中每条边的权是一个实数.另外,还给定 V 中的一个顶点,称为源.现在要计算从源到其他所有各顶点的最短路径长度.这里的长度是指路上各边权之 ...

  3. 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法

    Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负. Dijkstra算法是贪婪算法的一个很好的例子.设置一顶点集合S,从源点s到集合中的顶点的最终最短路径 ...

  4. 【算法导论】单源最短路径之Dijkstra算法

    Dijkstra算法解决了有向图上带正权值的单源最短路径问题,其运行时间要比Bellman-Ford算法低,但适用范围比Bellman-Ford算法窄. 迪杰斯特拉提出的按路径长度递增次序来产生源点到 ...

  5. 最短路径 - 迪杰斯特拉(Dijkstra)算法

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...

  6. 最短路径-迪杰斯特拉(dijkstra)算法及优化详解

    简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...

  7. 最短路径算法 2.Dijkstra算法

    Dijkstra 算法解决的是带权重的有向图上单源最短路径问题,该算法要求所有边的权重都为非负值.该算法的时间复杂度是O(N2),相比于处理无负权的图时,比Bellmad-Ford算法效率更高. 算法 ...

  8. [最短路径问题]Dijkstra算法(含还原具体路径)

    前言 在本篇文章中,我将介绍 Dijkstra 算法解决 单源最短路径问题 ,同时还包含了具体路径的还原.以下是我自己的全部学习过程与思考,参考书籍为 <数据结构>(C++语言版) 邓俊辉 ...

  9. 最短路问题---Dijkstra算法学习

    Dijkstra又称单源最短路算法,就从一个节点到其他各点的最短路,解决的是有向图的最短路问题 此算法的特点是:从起始点为中心点向外层层扩展,直到扩展到中终点为止. 该算法的条件是所给图的所有边的权值 ...

  10. 最短路问题Dijkstra算法

    Dijkstra算法可以解决源点到任意点的最短距离并输出最短路径 准备: 建立一个距离数组d[ n ],记录每个点到源点的距离是多少 建立一个访问数组v[ n ],记录每个点是否被访问到 建立一个祖先 ...

随机推荐

  1. WPF 入门笔记 - 04 - 数据绑定

    慢慢来,谁还没有一个努力的过程. --网易云音乐 概述 数据绑定概述 (WPF .NET) 什么是数据绑定? 数据绑定(Data Binding)是WPF一种强大的机制,用于在应用程序的各个部分之间建 ...

  2. 【Unity3D】魔方

    1 需求实现 ​ 绘制魔方 中基于OpenGL ES 实现了魔方的绘制,实现较复杂,本文基于 Unity3D 实现了 2 ~ 10 阶魔方的整体旋转和局部旋转. ​ 本文完整代码资源见→基于 Unit ...

  3. 20.AQS家族的“外门弟子”:CyclicBarrier

    关注王有志,一个分享硬核Java技术的互金摸鱼侠 欢迎你加入Java人的提桶跑路群:共同富裕的Java人 今天我们来学习AQS家族的"外门弟子":CyclicBarrier. 为什 ...

  4. C++面试八股文:static_cast了解一下?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第20面: 面试官:C++中支持哪些类型转换? 二师兄:C++支持C风格的类型转换,并在C++11引入新的关键字规范了类型转换. 二师兄:C++11引 ...

  5. 从零实现俄罗斯方块(c语言+思路分析)

    俄罗斯方块 文章说明: 本文大部分参考至俄罗斯方块(C语言实现)_c语言俄罗斯方块_2021dragon的博客-CSDN博客,本人经过修改编辑,改变了文章的一些思路顺序,使得新手便于理解(个人想法). ...

  6. Shodan使用指南

    Shodan是用于搜索连接到互联网的设备的工具.与搜索引擎可以帮助你找到网站不同,Shodan可以帮助你找到有关台式机,服务器,IoT设备等的信息.此信息包括元数据,例如在每个设备上运行的软件. Sh ...

  7. quarkus实战之三:开发模式(Development mode)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 前文咱们曾提到过几种启动方式,有一种用mav ...

  8. Linux 问题:网络相关

    防火墙 同网段双网卡 双网关 看服务日志

  9. vulnhub Necromancer wp

    flag1 nmap -sU -T4 192.168.220.130 有666端口 nc -nvu 192.168.220.130 666 监听回显消息 tcpdump host 192.168.22 ...

  10. Go中 net/http 使用

    转载请注明出处: net/http是Go语言标准库中的一个包,提供了实现HTTP客户端和服务器的功能.它使得编写基于HTTP协议的Web应用程序变得简单和方便. net/http包的主要用途包括: 实 ...