迪傑斯特拉演算法拆解

2021-10-02 18:10:11 字數 1554 閱讀 6446

最近學習了迪傑斯特拉演算法,總覺得看著頭大,我自己嘗試將演算法過程一步步拆解,以便總結為模板使用。

迪傑斯特拉演算法一般用於求最短路徑的題目,是一種常用的演算法。

這裡借用一下大話資料結構的來講解。

這張圖我們是需要從源點(v0)到終點(v8)的最短路徑。

這個思路是咋樣呢?

這是第一步:首先從v0開始,我們設乙個集合v,v0開始的話就將v0放入集合中。

第二步:我們看與v0有直接連線的頂點有哪些,有v1和v2,我們將沒有直接連線的頂點距離看做∞,則其中最短的路徑便是v0到v1的點,長度為1。此時我們將頂點v1放入集合v。

第三步是關鍵的一步:集合中已經有v1與v2了,也就是說這個集合此時與3個頂點有直接的連線(v2,v3,v4)。則此時我們的v0通過v1這個頂點,從而可找出下乙個到集合的最短路徑節點(v2)。

總結:思路即為不斷將頂點併入集合,然後尋找集合與其他直接連線點的最短路徑。

還是這張圖,我們來求源點到終點的最短路徑。

按照我們前面的思路,我們可以得知我們需要:

乙個代表∞的數==>infinity 65535乙個代表陣列大小的常量 ==>maxvex 9乙個集合陣列==>final [ maxvex ]乙個記錄源點v0到其他頂點權重的陣列d [ maxvex ]乙個記錄點與點直接前驅關係的陣列 ==>p [ maxvex ](此陣列用於輸出路徑過程)

當然,我們肯定需要鄰接矩陣圖。

現在我們的準備差不多齊全了,接下來就是我們的程式了。

初始化

int v;

int final[maxvex]

;for

(v=0

;v)//此處為遍歷鄰接矩陣的第一行d[0

]=0;

final[0]

=1;//初始化完畢

這個初始化我們相當於做了兩步,第一步我們是將final與p初始化為0,第二步我們是將d初始化為鄰接矩陣的第一行(即v0與直接連線點的距離)。

開始迴圈求v0到v頂點的最短路徑並且更改v0到其他點的直接長度

int v,min,w,k

for(v=

1;vfinal[k]=1

;//此為關鍵**

for(w=

0;w}

關鍵**便是更改v0與之後頂點的距離的**,理解了這一步,整個迪傑斯特拉演算法便沒有難點了。

迪傑斯特拉演算法

if object id t test is not null drop table t test gocreate table dbo t test id int identity 1,1 not null primary key,自增字段,無意義 header varchar 500 第一點的名...

迪傑斯特拉演算法

dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法 能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短...

迪傑斯特拉演算法

迪傑斯特拉演算法用來計算圖中某一點到其他點的最短距離,這個圖可以是加權,也可以是無權的,距離指的是從一點到其它點所經過的邊的權重和 假設現在有乙個加權無向圖,我們要求節點1到其他點的最短距離 初始化圖arr 用乙個鄰接矩陣來表示一張圖,矩陣元素 初始化一維向量d,這個向量儲存的是其他點的最短距離,初...