【Dijkstra】最短路算法的一种

这篇具有很好参考价值的文章主要介绍了【Dijkstra】最短路算法的一种。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先,本文默认读者基本熟悉Dijkstra基本原理

  DIjkstra是单源最短路的一种算法。使用数组d[i]来储存结点i到源点s的最短路径长度,每次更新d[i]数组后,d[i]中最小的一定是一条最短路径长度。也就是说每次更新后都能找到一条最短路径,以下给出证明:

  假设d[]数组中当前最小值对应的结点为u,那么d[u]<=d[i](u != i)假设d[u]不是结点u到源点s的最短路径长度,那么一定有某种方式通过其他路径到达u,使得d[v] + w < d[u],但是由于通过源点到达其他结点的距离d[i] >= d[u] 那么不可能有其他更短的路径到达u了,故d[u]就是最短路径长度。重复以上过程n次,就能得到n个结点的最短路径长度。

  那么,具体应该怎么实现呢。

  考虑到最小值查找,我们可以考虑几种优化,比如优先队列,可以降低时间复杂度,以下是个人实现代码:

  

 1 #include<bits/stdc++.h>
 2 #define int long long
 3 using namespace std;
 4 const int INF = 1e18 + 10,maxn = 1e5 + 10;
 5 
 6 bool vis[maxn];
 7 int d[maxn];
 8 struct node{
 9     int v,w;
10     
11     //重载运算符 < 这是一种方法
12     bool operator < (const node & x) const{
13         return w > x.w;
14     }
15 };
16 int n,m;
17 vector<node> G[maxn];
18 
19 void Dijkstra(int s){
20     fill(d,d + maxn,INF);
21     //将所有点断开
22     d[s] = 0;
23     priority_queue<node> q;
24     
25     //确定最短路径
26     //当前能确定的最短路
27     q.push({s,0});
28     while(!q.empty()){
29         node t = q.top();
30         q.pop();
31         int u = t.v;
32         if(vis[u]) continue;
33         vis[u] = true;
34         //相当于结点u已经确定最短路径
35         
36         int len = G[u].size();
37         for(int i = 0; i < len; i++){
38             int v = G[u][i].v;
39             int w = G[u][i].w;
40             if(d[u] + w < d[v]){
41                 //这一步是收缩长度,找到没有确定最短路径的结点中的最小长度
42                 d[v] = d[u] + w;
43                 q.push({v,d[v]});
44             }
45         }
46     }
47     
48 }
49 signed main (){
50     ios::sync_with_stdio(false);
51     cin.tie(0),cout.tie(0);
52     
53     cin>>n>>m;
54     while(m--){
55         int u,v,w;
56         cin>>u>>v>>w;
57         G[u].push_back({v,w});
58     }
59     Dijkstra(1);
60     if(d[n] == INF){
61         cout<<-1<<'\n';
62     }else{
63         cout<<d[n]<<'\n';
64     }
65     return 0;
66 }

 文章来源地址https://www.toymoban.com/news/detail-776872.html

到了这里,关于【Dijkstra】最短路算法的一种的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Dijkstra算法求最短路

    Dijkstra算法的流程如下: 1.初始化dist[1] = 0,其余节点的dist值为无穷大。 2.找出一个未被标记的、dist[x]最小的节点x,然后标记节点x。 3.扫描节点x的所有出边(x,y,z),若dist[y] dist[x] + z,则使用dist[x] + z更新dist[y]。 4.重复上述2~3两个步骤,直到所有的节点都被标记。 Dijk

    2024年02月06日
    浏览(29)
  • dijkstra模板及例题(最短路算法)

            大家好,我是永遇乐金枪鱼。图论和树论是算法中占比大且非常重要的内容,而且树论是特殊的图论,而图论中最经典的就是求解最短路,而最短路算法是比较广泛且冗杂的算法,与其相关的有较多的算法,下面我给大家讲讲常用算法之一——dijkstra算法。  📒博客

    2023年04月08日
    浏览(28)
  • 二、搜索与图论6:Dijkstra 模板题+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency)

    朴素dijkstra算法 对应模板题:Dijkstra求最短路 I 时间复杂是 O(n^2+m):n 表示点数,m 表示边数 堆优化版dijkstra 对应模板题:Dijkstra求最短路 II 时间复杂度 O(mlogn):n 表示点数,m 表示边数 树是一种特殊的图 ,与图的存储方式相同。 对于无向图中的边ab,存储两条有向边a-b, b-a。

    2024年02月14日
    浏览(23)
  • 12.图论1 最短路之dijkstra算法

    二分图 判定:染色法。 性质: 可以二着色。 无奇圈。 树的直径模板 两遍dfs/bfs,证明时反证法的核心是用假设推出矛盾。 设1是一开始随机选的点,s是与其最远的点,证明s是直径的一端。 反证:假设s不是直径的一端,ss是直径的一端。 现在要做的就是证明ss是直径的一端

    2024年02月20日
    浏览(28)
  • 数据结构--最短路径 Dijkstra算法

    计算  b e g i n  点到各个点的最短路 color{red}计算 begin 点到各个点的最短路 计算   b e g in   点到各个点的最短路 如果是无向图,可以先把无向图转化成有向图 我们需要2个数组 final[] (标记各顶点是否已找到最短路径)与 dis[] (最短路径⻓度)数组 Dijkstra算法是一种用于

    2024年02月12日
    浏览(23)
  • 【图论算法】最短路径算法(无权最短路径、Dijkstra算法、带负边值的图、无圈图)

    本篇博客将考察各种最短路径问题。     无权最短路径     Dijkstra 算法     具有负边值的图     无圈图     所有顶点对间的最短路径     最短路径的例子–词梯游戏 输入是一个赋权图:与每条边 (v i , v j ) 相联系的是穿越该边的开销(或称为值

    2023年04月12日
    浏览(27)
  • C++算法:单源最短路径Dijkstra

    如果你有一份北京地图,想从中关村走到三元桥,那么怎样能找出实现这一目的的最短路径呢?一种可能的方法就是将这两点之间所有的路线都找出来,然后求出每条路线的距离,找出最短的路线。但是仔细想想我们就会发现这种办法几乎是不可行的,因为这样的路线太多了,

    2024年02月09日
    浏览(30)
  • 最短路径算法|Dijkstra‘s Algorithm

    最短路径问题几乎是每个计算机专业学生的必学知识点,相关的算法也比较多样,但其中最经典的肯定是由荷兰计算机科学家,1972年图灵奖得主Edsger Dijkstra于1959年发布的Dijkstra\\\'s Algorithm。 最短路径问题简单来说就是给定一个图和图中的一个源顶点,找到从源到给定图中所有

    2023年04月14日
    浏览(33)
  • 图论算法基础:单源最短路径Dijkstra算法分析

    在 有向带权图 中给定一个起始顶点(源点),Dijkstra算法可以求出 所有其他顶点 到源点的最短路径,Dijkstra算法 不能用于同时含有正负权值的边的图 Source 顶点集合:已经确定 到源点的最短路径 的顶点就会加入 Source 集合中, Source 集合初始时只有源点 dist 数组:用于记录每个顶点到

    2024年02月11日
    浏览(26)
  • Dijkstra’s 最短路径算法的 Matlab实现

    随机生成400个点,再去除其中的120个点作为‘路障’。采用dijkstra算法寻找最短路径。   思路: step1:定义地图大小/内容 step2:把随机生成的‘视觉地图’信息载入‘矩阵地图’ step3:使用dijkstra原理寻找最短路径 step4:连点成线 把 ‘视觉地图’ 信息载入矩阵的原理/逻辑

    2024年02月07日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包