首页 > 编程语言 >Dijkstra 算法的手动分析

Dijkstra 算法的手动分析

时间:2024-06-11 12:33:00浏览次数:28  
标签:-- 手动 算法 V2 V0 V1 Dijkstra V3 V4

目录

Dijkstra 算法

以下面有向图为例:

graph LR V0((V0)) -- 10 --> V1((V1)) V0((V0)) -- 5 --> V4((V4)) V1((V1)) -- 2 --> V4((V4)) V4((V4)) -- 3 --> V1((V1)) V1((V1)) -- 1 --> V2((V2)) V4((V4)) -- 9 --> V2((V2)) V4((V4)) -- 2 --> V3((V3)) V3((V3)) -- 7 --> V0((V0)) V3((V3)) -- 6 --> V2((V2)) V2((V2)) -- 4 --> V3((V3))

step0. 初始状态

  • final 数组:标记各顶点是否已找到最短路径
V0 V1 V2 V3 V4
True False False False False
  • dist 数组:记录从源点(V0)到该点(Vi)的最短路径长度
V0 V1 V2 V3 V4
0 10 5
  • path 数组:路径上的前驱(前面的结点)
V0 V1 V2 V3 V4
-1 0 -1 -1 0

step1. 第一轮

【1】找到 step0 中 :final 数组还未确定的最短路径,且在 dist 数组中最小的顶点 Vi = V4,令 final[i] = True。

  • final 数组:
V0 V1 V2 V3 V4
True False False False True

【2】检查所有邻接自 Vi = V4 的点,若其 final 值为 False,则对比 step0 中的 dist 信息,如果找到的路径比当前的信息还小,则更新其 dist 和 path 信息。

对于 V1(原本 dist = 10, path = 0):final 值为 False,从 V0-->V4-->V1 的路径长度为 5+3=8<10,所以需要更新其 dist =8,path = 4;

对于 V2(原本 dist = ∞, path = -1):final 值为 False,从 V0-->V4-->V2 的路径长度为 5+9=14<∞,所以需要更新其 dist =14,path = 4;

对于 V3(原本 dist = ∞, path = -1):final 值为 False,从 V0-->V4-->V3 的路径长度为 5+2=7<∞,所以需要更新其 dist =7,path = 4。

  • dist 数组:
V0 V1 V2 V3 V4
0 8 14 7 5
  • path 数组:
V0 V1 V2 V3 V4
-1 4 4 4 0

step2. 第二轮

【1】找到 step1 中 :final 数组还未确定的最短路径,且在 dist 数组中最小的顶点 Vi = V3,令 final[i] = True。

  • final 数组:
V0 V1 V2 V3 V4
True False False True True

【2】检查所有邻接自 Vi = V3 的点(对应 dist = 7,path = 4),若其 final 值为 False,则对比 step1 中的 dist 信息,如果找到的路径比当前的信息还小,则更新其 dist 和 path 信息。

对于 V0:final 值为 True。

对于 V2(原本 dist = 14,path = 4):final 值为 False,从 V0-->V4-->V3-->V2 的路径长度为 7+6=13<14,所以需要更新其 dist =13,path = 3。

  • dist 数组:
V0 V1 V2 V3 V4
0 8 13 7 5
  • path 数组:
V0 V1 V2 V3 V4
-1 4 3 4 0

step3. 第三轮

【1】找到 step2 中 :final 数组还未确定的最短路径,且在 dist 数组中最小的顶点 Vi = V1,令 final[i] = True。

  • final 数组:
V0 V1 V2 V3 V4
True True False True True

【2】检查所有邻接自 Vi = V1 的点(对应 dist = 8,path = 4),若其 final 值为 False,则对比 step2 中的 dist 信息,如果找到的路径比当前的信息还小,则更新其 dist 和 path 信息。

对于 V2(原本 dist = 13,path = 3):final 值为 False,从 V0-->V4-->V1-->V2 的路径长度为 8+1=9<13,所以需要更新其 dist =9,path = 1。

对于 V4:final 值为 True。

  • dist 数组:
V0 V1 V2 V3 V4
0 8 9 7 5
  • path 数组:
V0 V1 V2 V3 V4
-1 4 1 4 0

step4. 第四轮

【1】找到 step2 中 :final 数组还未确定的最短路径,且在 dist 数组中最小的顶点 Vi = V2,令 final[i] = True。

  • final 数组:
V0 V1 V2 V3 V4
True True True True True

【2】检查所有邻接自 Vi = V2 的点(对应 dist = 9,path = 1),若其 final 值为 False,则对比 step2 中的 dist 信息,如果找到的路径比当前的信息还小,则更新其 dist 和 path 信息。

已经找不到其他未访问结点,算法结束,以下为最终结果:

  • dist 数组:
V0 V1 V2 V3 V4
0 8 9 7 5
  • path 数组:
V0 V1 V2 V3 V4
-1 4 1 4 0

标签:--,手动,算法,V2,V0,V1,Dijkstra,V3,V4
From: https://www.cnblogs.com/Mount256/p/18241843

相关文章

  • RSA算法中,为什么需要的是两个素数?
    PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。RSA算法中,为什么需要的是两个素数?RSA算法是一种广泛使用的非对称加密技术,基于大数分解的困难性。本文将探讨为什么RSA算法需要两个素数,并以通......
  • 数据结构---排序算法
    个人介绍hellohello~,这里是code袁~......
  • 代码随想录算法训练营第七天 |
    454.四数相加题目:给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0解题:思路:使用map,key为a+b,value为出现次数。再遍历k、l寻找0-a-b。关键:遍历......
  • 【算法与数据结构】【数组篇】【题1-题5】
    1.数组基本知识点1.1概念数组就是一个集合。数组会用一些名为索引的数字来标识每项数据在数组中的位置,且在大多数编程语言中,索引是从0算起的。我们可以根据数组中的索引,快速访问数组中的元素。数组中的元素在内存中是连续存储的,且每个元素占用相同大小的内存。1.2相关操......
  • LeetCode 算法:缺失的第一个正数c++
    原题链接......
  • 【算法学习】圆方树——处理仙人掌的利器
    圆方树大概分两种,一个是圆方树,一个是广义圆方树。圆方树这可以解决仙人掌上的问题。任意一条边至多只出现在一条简单回路的无向连通图称为仙人掌。很多题解将其作为无向图构建,本文将其构建为外向树,在这个问题中两种构建方式不会影响求解。构建方式记读入的图为原图,构建的......
  • 二叉树相关算法题汇总-go语言实现
    总结先序中序后序遍历就能解决一些算法题。层次遍历使用队列。从左子树、右子树获取答案,然后结合根节点来计算答案。前缀树,比Hashset更稳定。O(1),只不过占内存。trie树。递归。递归,递归。到叶子节点收集答案。然后移除路径。packagemainimport( "fmt" "math......
  • 程序设计与算法(三)C++:第四章poj代码
    课程:北京大学程序设计与算法(三)   MOOCOJ:OpenJudge014:MyString这个题需要写的函数有点多我们来分析一下。charw1[200],w2[100]; while(cin>>w1>>w2){ MyStrings1(w1),s2=s1;//构造函数题目有了,不用写//复制构造函数没有,需要写 MyStrings3......
  • 代码随想录算法训练营第三十五天 | 1005.K次取反后最大化的数组和 134.加油站 135.分
    1005.K次取反后最大化的数组和题目链接文章讲解视频讲解思路:  按绝对值从大到小排序  遍历数组,遇到负数,如果次数未用完就取反  最后如果剩余次数未用完且为奇数就将数组最后一个元素取反classSolution{staticboolmyCompare(constint&lhs,constint&r......
  • 算法
    背包问题#include<cstdio>#include<cstring>usingnamespacestd;intT,n,sum,w[205],lim;//w[i]:物品i的价值booldp[20005];intmain(){while(1==scanf("%d",&T)){while(T-->0){sum=0;scanf(&q......