給定圖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基本思路 找到最短距離已經確定的頂點,從它出發...