C語言 迪傑斯特拉 Dijkstra 演算法

2021-10-08 05:32:04 字數 2801 閱讀 9418

日常生活中,當我們出去旅遊、辦事等等,面對陌生的環境,我們常常需要規劃自己的路線,來使移動的距離最短或是開銷最低。那麼,今天給大家簡單介紹一種針對網圖最短路徑演算法——迪傑斯特拉演算法

最短路徑:即起點和終點之間經過的邊上權值(weight)之和最小的路徑。

其中:v0->v1為v0到v1的最短路徑,且v1與v2鄰接。我們怎麼知道其他路徑,例如v0->v1->v4->v2不是最短路徑呢,顯然該網不是。

但是在實際求解中,我們也是求得v0到v4最短距離再加上v4->v2的距離跟其它v0到v2的鄰接點的最短距離加上該鄰接點到v2的直接距離作比較,較小者為當前最短路徑

請注意這個「當前」,也就是說這個演算法是不斷求解並更新當前最短路徑,最後獲得正確結果的演算法。

例如

我們以v0為起點,首先我們發現最短路徑為v0->v1,於是我們選擇v1,尋找v1的鄰接點(不包括已經求得最短路徑的v0,顯然v0->v0 = 0為最短路徑),v1鄰接v2、v3、v4,那麼我們得到,若以v1為前驅頂點,到達v2的距離為1 + 3 = 4,到達v3距離為8,v4為6。

第二步,已有最短路徑的點為v0和v1,接下來繼續尋找v0和v2的當前最短路徑(可通過已知含最短路徑的點),也就是v0->v1->v2的4,然後我們更新當前驅頂點為v2時,v0到v4和v5的距離。

g=

初始時令 s=,t=v-s=,t中頂點對應的距離值 [1]

若存在,d(v0,vi)為弧上的權值 [1]

若不存在,d(v0,vi)為∞ [2]

從t中選取乙個與s中頂點有關聯邊且權值最小的頂點w,加入到s中 [1]

對其餘t中頂點的距離值進行修改:若加進w作中間頂點,從v0到vi的距離值縮短,則修改此距離值 [1]

重複上述步驟2、3,直到s [1] 中包含所有頂點,即w=vi為止 [1]

迪傑斯拉演算法是乙個按路徑長度遞增的次序產生最短路徑的演算法

迪傑斯拉演算法類似貪心演算法,即每一步只考慮當前最優選擇,把每一步的最優解看做總體的最優解,儘管它並不是一定正確的。

不過,迪傑斯拉演算法會不斷的修正這個每一小步的最優解,從而是最終答案是正確的。

本篇網的儲存採用鄰接矩陣(adjacency matrix),即以乙個對應邊的二維陣列(稱之為矩陣)和乙個對應頂點表的一維陣列來儲存網的結構體。

我們把一維陣列稱為vex,二維陣列稱之為arc。

一維陣列儲存型別由頂點決定,這裡我們假設為char型別。

vexs[0] == 『a』的含義為:下標為0的頂點名稱叫做』a』。

二維陣列arc[1][2]的含義為:從頂點v1到頂點v2的距離

同時為了演算法實現方便,我們約定:矩陣中儲存的值,無窮代表兩點不鄰接,有限正整數代表權值,若為0則代表起點終點相同。(無窮的原因是便於更新代表最短路徑的陣列,這點接著閱讀就能體會到,這也是一般演算法的常見做法)。

我們用d[v]來存v0到v的最短路徑長度,p[v]存求得當前最短路徑時的前驅頂點下標,final[v]來表示是否為最終的最短路徑。

例如:d[2] = 4 , p[2] = 1 ,final[2] = 1分別表示v0到v2最短路徑為2,最短時的前驅頂點為v1,v2已經找到最短路徑。

mgraph.c (m表示矩陣matrix)

//鄰接矩陣

#include

#define maxsize 100

#define infinity 65535

//表示無邊(weight有時為0,不用0表示)

typedef

char vertextype;

typedef

int edgetype;

typedef

struct

mgraph;

void

createmgraph

(mgraph *g)

}

dijkstra.c

//迪傑斯特拉演算法生成最短路徑

//求解有向網g的v0頂點到其餘頂點v最短路徑p[v]及帶權長度d[v]

//p[v]:前驅下標頂點,d[v]:v0到v的最短路徑長度

#include

"mgraph.c"

#define maxvex 9

typedef

int patharc[maxvex]

;//儲存最短路徑下標

typedef

int shortpathtable[maxvex]

;//最短路徑權值和

void

dijkstra

(mgraph g,

int v0, patharc *p, shortpathtable *d)

(*d)

[v0]=0

; final[v0]=1

;//每次求得v0到某個頂點的最短路徑

for(v =

1; v < g.numvertexes; v++)}

final[k]=1

;//修正鄰接點當前最短路徑及距離

for(w =

0; w < g.numvertexes; w++)}

}}

《大話資料結構》

迪傑斯特拉演算法 C語言

include include define infin 65535 define max vertex num 20 int final 6 typedef enum graphkind 有向圖,有向網,無向圖,無向網 typedef struct arccell arccell,adjmatri...

C 迪傑斯特拉演算法

網上有許多版本的,自己還是寫乙個理解點 dijkstra.cs public class dijkstra public void initweights list weights public listfind string start,string end var s nodes.where x...

迪傑斯特拉演算法

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 第一點的名...