數學建模 Dijkstra最短路徑演算法

2021-10-02 10:58:17 字數 2565 閱讀 8034

給定圖g=(v(g),e(g))以及v(g)中的一對頂點u和v,我們可以把u到v的距離定義為u到v的一條邊數最少的路徑。用記號d(u,v)來表示這個距離。於是距離問題就是計算給定圖g的d(u,v)以及兩個特定的頂點u和v。

例如本圖,如不考慮圖上各點之間的距離,即各點之間的距離為1.則d(u,y)=2,即經過w點後到達y點的距離。若考慮各點之間的距離為圖上的距離,則g中最短路徑為u經過v、w兩個節點z之後的長度,即1+2+3=6。因此,d(i,j)只考慮i和j間邊的數目,而最短路徑要考慮邊的長度。

為了更簡單理解最短路徑的求法,我們需要乙個物理模擬。假設如上圖所示,圖中有u和y,以及每條邊的邊長。我們要以細繩為模型。假設上圖中每個節點為細繩與細繩之間所打的結,而節點間的距離為邊的權重(不管單位是公尺還是公釐,統一即可),細繩即是邊。我們為了求u和y的最短路徑,可以將細繩的u和y兩個結拉緊,此時u和y的最短路徑為此時繩的長度,中間的結即所經過的節點。

輸入圖g=(v(g),e(g))有乙個源頂點s和乙個匯頂點t,以及對所有的邊ij∈e(g)的非負邊長cij。

輸出g中從s到t的最短路徑的長度

第0步從對每個頂點做臨時標記l開始,做法如下:l(s)=0,且對除s外所有的頂點l(i)=∞

第1步找帶有最小臨時標記的頂點(如果有結,隨機的取乙個)。使該標記變成永久標記,即該標記不再改變

第2步對每個沒有永久標記但是又帶有永久標記的頂點相鄰的頂點j,按如下方法計算乙個新的臨時標記:l(j)=min,求最小是對所有帶有永久標記的頂點i做的。重複第1步和第2步,直到所有的頂點都打上了永久標記為止。

%inf代表該點與其他點的距離為inf

% v w y u x z

w=[inf 2 inf 1 inf inf ;

%v 2 inf 3

78 inf ;

%w inf 3 inf inf inf 4;%y

17 inf inf 6 inf ;

%u inf 8 inf 6 inf 6;%x

inf inf 4 inf 6 inf ;];

%z[distance,path]

=dijk

(w,4,3

);

function [ distance path]

=dijk

( w,st,e )

%dijk summary of this function goes here

% w 權值矩陣 st 搜尋的起點 e 搜尋的終點

n=length

(w);

%節點數

d =w

(st,:)

;visit=

ones(1

:n);

visit

(st)=0

;parent =

zeros(1

,n);

%記錄每個節點的上乙個節點

path =

;for i=

1:n-

1 temp =

;%從起點出發,找最短距離的下乙個點,每次不會重複原來的軌跡,設定visit判斷節點是否訪問

for j=1:n

ifvisit

(j) temp =

[temp d

(j)]

;else

temp =

[temp inf]

; end

end[value,index]

=min

(temp)

;visit

(index)=0

;%更新 如果經過index節點,從起點到每個節點的路徑長度更小,則更新,記錄前趨節點,方便後面回溯循跡

for k=1:n

ifd(k)

>

d(index)+w

(index,k)

d(k)=d

(index)+w

(index,k)

;parent

(k)= index;

endend

enddistance =

d(e)

;%最短距離

%回溯法 從尾部往前尋找搜尋路徑

t = e;

while t~

=st && t>

0 path =

[t,path]

; p=

parent

(t);t=p;

endpath =

[st,path]

;%最短路徑

end

>>

dijk

(w,4,3

)ans =

6

如果感覺本文對您有幫助,請留下您的贊,您的支援是我堅持寫作最大的動力,謝謝!

Dijkstra 最短路徑

dijkstra 最短路徑 針對有向圖,不支援負權值 圖的相鄰矩陣表示方法,還要用到最小值堆 include include define unvisited 0 define visited 1 define infinite 9999 設定最大值 define n 5 定義圖的頂點數 using...

dijkstra最短路徑

hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外n 1個地方,這些地方都能互相到達,且所有的邊都是有方向的。現在hehe要做的事就是去那些地方找回那n 1件禮物給xixi 由於每一件禮物都有特殊的意義,所以xixi要求hehe每找到一件禮物,就必...

最短路 Dijkstra演算法

dijksitra演算法求最短路僅僅適用於不存在右邊是負權的情況 bellman ford演算法沒有這乙個限制 主要特點是從起點為中心向外層層擴充套件,直到擴充套件到終點為止。即乙個最短路路徑中經過的所有點這條路均是其最短路。反證法易證 dijkstra基本思路 找到最短距離已經確定的頂點,從它出發...