Dijkstra迪杰斯特拉算法 C++實現

本篇文章主要介紹了Dijkstra迪杰斯特拉算法的C++實現,文章包含兩個部分,在第一部分中我會簡單介紹迪杰斯特拉算法以及一些個人的理解,第二部分會對C++代碼的邏輯進行解釋。下面是我已經上傳的代碼資源,大家有興趣的可以點擊鏈接下載資源。
迪杰斯特拉算法的C++實現

迪杰斯特拉算法本質上是一個貪心算法,通過不斷迭代取得局部最優解的方法,最終找到整體的最優解。迪杰斯特拉算法主要用于在有權圖中計算出各節點到初始節點的最短路徑。在接下來的分析中我會使用的有權圖如下 :


其中,ABCDE就是我們需要遍歷的節點,連接節點的弦上的數字表示了兩節點之間的"距離",或稱之為權重,消耗。需要注意的幾點是 :

  1. 迪杰斯特拉算法適用的有權圖中,節點之間的權重不要求是雙向的,即 A-> B的權重和 B->A 的權重不要求相同。換而言之,有權圖中節點之間的連接可以是單向的,或者在兩個方向權重有所不同的。
  2. 迪杰斯特拉算法適用的有權圖中,節點間連接的權重值不能是負值。

了解了迪杰斯特拉算法的一些注意點之后,我們下面來重點解釋算法的實現。之前我們已經提到了,迪杰斯特拉算法多用于解決最短路徑問題,對應上述有權圖就是計算出所有節點到初始節點的最短距離。在下述例子中,我們默認使用A作為初始節點,目標就是找出所有節點到A的最短距離以及所經過的路徑。
首先我們需要兩個列表,一個visited列表用于存放已經遍歷過其所有鄰節點的節點,一個unvisited列表用于存放還未遍歷過其所有鄰節點的節點。我們會不斷地進行迭代運算,直到unvisited列表為空,即所有的節點都已經訪問過(遍歷過其所有鄰節點)。
顯然初始狀態,visited列表為空[],unvisited列表中包含所有的節點[A,B,C,D,E]。
然后我們需要一個列表用于記錄所有節點到A節點,起始節點之間的最短距離,以及最短路徑中該節點之前的節點。
第一步,初始化這個表格 :
顯然A到A的距離為0,其余節點到A的距離為未知,初始化為正無窮。

節點節點到A的距離最短路徑中該節點之前的節點
A0
B∞\infin
C∞\infin
D∞\infin
E∞\infin

那么每一次迭代,我們需要做的,就是在unvisited列表中,選擇一個到A距離最短的節點,并遍歷更新其所有unvisited列表中的鄰節點。
例如第一次迭代中,unvisited未訪問列表中A節點到A的最短距離最短,那么我們首先就訪問A所有unvisited的節點 B 和 D。簡單來說,如果通過A訪問B比起之前的方式要距離更短,那么我們就更新B到初始點的距離為新的最短距離,并將B之前的節點更新為A。那么在這個例子中,通過A訪問B的距離為6,通過A訪問D的距離為1,顯然距離都比正無窮要小,則更新列表如下 :

節點節點到A的距離最短路徑中該節點之前的節點
A0
B6A
C∞\infin
D1A
E∞\infin

同時更新visited列表以及unvisited列表:
visited : [A]
unvisited : [B,C,D,E]

既然未訪問列表仍然不為空,我們繼續迭代,選擇D作為新的訪問節點,因為節點D目前到A的距離最短。那么節點D在unvisited列表中的鄰節點有 B E,那么我們更新B,E的值和其原來的距離進行對比。 B : 1+2 = 3 < 6 \space? E : 1+1 = 2 < ∞\infin
更新列表如下 :

節點節點到A的距離最短路徑中該節點之前的節點
A0
B1+2 = 3D
C∞\infin
D1A
E1+1 = 2D

同時更新visited列表以及unvisited列表:
visited : [A,D]
unvisited : [B,C,E]
我們繼續迭代,方法同上。
訪問E節點,更新列表 :

節點節點到A的距離最短路徑中該節點之前的節點
A0
B1+2 = 3D
C1+1+5 = 7E
D1A
E1+1 = 2D

同時更新visited列表以及unvisited列表:
visited : [A,D,E]
unvisited : [B,C]

繼續訪問B,更新列表 :
B的唯一沒有訪問的鄰節點為C,但A> … >B>C 的距離為 3+5=8 >7,因此C到節點A的距離不變。

節點節點到A的距離最短路徑中該節點之前的節點
A0
B1+2 = 3D
C1+1+5 = 7E
D1A
E1+1 = 2D

同時更新visited列表以及unvisited列表:
visited : [A,D,E,B]
unvisited : [C]
最后我們訪問C,列表不變,因為C的所有鄰節點都已經訪問過了。
最終的結果如下 :

節點節點到A的距離最短路徑中該節點之前的節點
A0
B3D
C7E
D1A
E2D

通過迪杰斯特拉算法,我們可以完備地遍歷所有有權圖中的節點,并在最后返回一個所有節點到初始點的最短距離,以及對應的最短路徑的所有節點之前的節點。之后通過不斷訪問最短路徑中該節點之前的節點,我們就可以很簡單地還原出最短路徑。例如對節點C而言,C之前的節點為E,E之前的節點為D,D之前的節點為A,因此最短路徑還原為A > D > E > C。

參考 :
[1] Graph Data Structure 4. Dijkstra’s Shortest Path Algorithm

[2] (熟肉)Dijkstra算法詳解,輕松入門——Youtube

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386997.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386997.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386997.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python開發一個股票類庫

前言 使用Python開發一個股票項目。 項目地址&#xff1a; https://github.com/pythonstock/stock 相關資料&#xff1a; http://blog.csdn.net/freewebsys/article/details/78294566 主要使用開發語言是python。 使用的lib庫是pandas&#xff0c;tushare&#xff0c;Tens…

LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍歷建立二叉樹 C++...

LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍歷建立二叉樹 C Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that duplicates do not exist in the tree. For example, given…

C++ STL 學習筆記 3. 文本文件操作

本文主要總結了C中對文本文件的基本操作以及使用心得&#xff0c;第一部分中總結了C對文本文件的基本操作&#xff0c;第二部分中會以csv文件為例&#xff0c;進行讀取存儲由逗號分隔的字符串的操作。 1. 文本讀取寫入基礎 要使用文件輸入輸出流&#xff0c;首先需要include相…

C# 調用python

1.C# 調用python 本質上是使用命令行運行python 1.1 C# 使用命令行 program.cs using System; using System.Diagnostics; using System.IO;namespace test {class Program{static void Main(string[] args){Program p new Program();string result p.run_cmd("ping…

4-17

1、html 中div class是什么&#xff1f; 在這里我將用id與class的比較&#xff0c;讓這個問題更容易理解&#xff08;1&#xff09;、使用區別id具有唯一性&#xff0c;在一個網頁中同一個命名只能使用一次&#xff1b;class命名的類可以在一個網頁中使用無數次。&#xff08;2…

python pandas serie簡介及基本使用

本篇文章主要羅列了pandas模塊中serie的基本使用。環境是jupyter notebook python 3.7。 serie是能夠保存任何類型數據的一維數組&#xff0c;軸標簽統稱為索引&#xff0c;索引必須是唯一的散列且與數據的長度相同&#xff0c;默認情況下為np.arange(n)。 首先是import pand…

Linux系統中nc工具那些不為人知的用法

Linux nc命令用法 參考地址&#xff1a;https://www.cnblogs.com/jjzd/p/6306273.html -g<網關>&#xff1a;設置路由器躍程通信網關&#xff0c;最多設置8個; -G<指向器數目>&#xff1a;設置來源路由指向器&#xff0c;其數值為4的倍數; -h&#xff1a;在線幫助;…

python pandas dataframe基本使用整理

dataframe是一種表格型的數據存儲結構&#xff0c;可以看作是幾個serie的集合。dataframe既有行索引&#xff0c;也有列索引。 以下代碼環境為google colab/jupyter notebook。 接下來就對dataframe的基本使用進行整理。 dataframe也從屬于pandas模塊&#xff0c;因此還是老規矩…

常見開源分布式存儲系統

對比說明 /文件系統 TFS FastDFS MogileFS MooseFS GlusterFS Ceph 開發語言 C C Perl C C C 開源協議 GPL V2 GPL V3 GPL GPL V3 GPL V3 LGPL 數據存儲方式 塊 文件/Trunk 文件 塊 文件/塊 對象/文件/塊 集群節點通信協議 私有協議&#xff08;T…

[十二省聯考2019]皮配

題目鏈接 選一個派系和一個陣營可以唯一確定一名導師 因為每一個陣營里的導師都分別來自不同派系&#xff0c;所以k0時&#xff0c;對陣營的選擇是不影響對派系的選擇的 唯一的限制就是同城市的要在同一個陣營 所以以每個城市為物品&#xff0c;物品大小為該城市的人數&#xf…

機器學習理論梳理1: PCA主成分分析

機器學習的理論部分學習知識點比較亂且雜。我這里通過幾篇文章&#xff0c;簡單總結一下自己對機器學習理論的理解&#xff0c;以防遺忘。第一篇文章主要概述了機器學習的基本任務以及一個常用的降維方法&#xff0c;主成分分析。 機器學習的基本任務 機器學習能實現許多不同…

29 _react-router說明

一、SPA的理解 1.單頁面web應用(single page web application ,SPA) 2.整個應用只有一個完整的頁面 3.點擊頁面中的鏈接不會刷新頁面&#xff0c;本身也不會向服務器發請求 4.當點擊路由鏈接時&#xff0c;只會做頁面的局部更新 5.數據都需要通過ajax請求獲取&#xff0c;并在前…

Java程序員如何快速理解Kubernetes

我們希望微服務是可復制的&#xff0c;可替換的工作節點&#xff0c;這樣可以輕松進行升級或降級&#xff0c;同時無需任何停機時間&#xff0c;并花費最少代價的管理。我們可以說我們希望他們成為我們的小黃人&#xff08;minions&#xff09;。本文我們將通過一個簡單的例子來…

NLP基礎 : HMM 隱馬爾可夫模型

Hidden Markov Model, HMM 隱馬爾可夫模型&#xff0c;是一種描述隱性變量(狀態)和顯性變量(觀測狀態)之間關系的模型。該模型遵循兩個假設&#xff0c;隱性狀態i只取決于前一個隱性狀態i-1&#xff0c;而與其他先前的隱形狀態無關。觀測狀態也只取決于當前的隱形狀態。因此我們…

關于秒殺系統優化方向

今天聽了一節咕泡學院的公開課&#xff0c;有收獲。 秒殺系統的特點&#xff1a; 1.限時&#xff1b;2.限量供應&#xff1b;3.并發量大&#xff1b;如何優化&#xff1a; 1.客戶端數據緩存。 2.CDN加速。 3.nginx動靜分離&#xff0c;靜態資源緩存&#xff0c;負載均衡。 4.se…

Mysql插入很慢,找到了稍微快點的方法

MYSQL批量插入數據庫實現語句性能分析 假定我們的表結構如下 代碼如下 CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( 50 ) NOT NULL, value VARCHAR( 50 ) NOT NULL, other_value VARCHAR( 50 ) NOT NULL ) 通常情況下單條插入的sql語句我們會這么寫&…

Linux - 時間相關命令 - ntpdate, date, hwclock

1. 概述 最近也不知道寫啥了, 把之前的老文檔整理一下, 湊個數什么的配置時間這種工作, 偶爾還是要用一下主要描述 3 個命令的簡單適用 ntpdatehwlock2. ntpdate 1. 概述 用于同步時鐘的命令2. 機制 通常是有一個服務器對外提供時間客戶端可以與時間服務器同步ntp 是他們之間交…

RUNOOB python練習題1

用來練手的python 練習題&#xff0c;原鏈接 : python練習實例1 題干 : 有四個數字&#xff1a;1、2、3、4&#xff0c;能組成多少個互不相同且無重復數字的三位數&#xff1f;各是多少&#xff1f; import numpy as np cen np.array([1,2,3,4]) tens np.array([1,2,3,4])…

mysql explain用法和結果的含義

explain顯示了mysql如何使用索引來處理select語句以及連接表。可以幫助選擇更好的索引和寫出更優化的查詢語句。 使用方法&#xff0c;在select語句前加上explain就可以了&#xff1a; 如&#xff1a; explain select surname,first_name form a,b where a.idb.id EXPLAIN列…

日志模塊logging用法

一、常用日志記錄場景及最佳解決方案&#xff1a; 日志記錄方式 最佳記錄日志方案 普通情況下&#xff0c;在控制臺顯示輸出 print() 報告正常程序操作過程中發生的事件 logging.info()(或者更詳細的logging.debug()) 發出有關特定事件的警告 warnings.warn()或者loggin…