單源最短路Dijkstra演算法 matlab實現

2022-03-27 18:32:42 字數 1756 閱讀 2208

迪傑斯特拉(dijkstra)演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。 

它的主要特點是以起始點為中心向外層層擴充套件(廣度優先搜尋思想),直到擴充套件到終點為止。

基本思想

通過dijkstra計算圖g中的最短路徑時,需要指定起點s(即從頂點s開始計算)。

此外,引進兩個集合s和u。s的作用是記錄已求出最短路徑的頂點(以及相應的最短路徑長度),而u則是記錄還未求出最短路徑的頂點(以及該頂點到起點s的距離)。

初始時,s中只有起點s;u中是除s之外的頂點,並且u中頂點的路徑是"起點s到該頂點的路徑"。然後,從u中找出路徑最短的頂點,並將其加入到s中;接著,更新u中的頂點和頂點對應的路徑。 然後,再從u中找出路徑最短的頂點,並將其加入到s中;接著,更新u中的頂點和頂點對應的路徑。 ... 重複該操作,直到遍歷完所有頂點。

操作步驟

(1)初始時,s只包含起點s;u包含除s外的其他頂點,且u中頂點的距離為"起點s到該頂點的距離"[例如,u中頂點v的距離為(s,v)的長度,然後s和v不相鄰,則v的距離為∞]。

(2)從u中選出"距離最短的頂點k",並將頂點k加入到s中;同時,從u中移除頂點k。

(3)更新u中各個頂點到起點s的距離。之所以更新u中頂點的距離,是由於上一步中確定了k是求出最短路徑的頂點,從而可以利用k來更新其它頂點的距離;例如,(s,v)的距離可能大於(s,k)+(k,v)的距離。

(4)重複步驟(2)和(3),直到遍歷完所有頂點。

matlab**實現如下:

function [mydistance,mypath]=mydijkstra(a,sb,db);

% 輸入:a—鄰接矩陣(aij)是指i到j之間的距離,可以是有向的

% sb—起點的標號, db—終點的標號

% 輸出:mydistance—最短路的距離, mypath—最短路的路徑

n=size(a,1); visited(1:n) = 0;

distance(1:n) = inf; % 儲存起點到各頂點的最短距離

distance(sb) = 0; parent(1:n) = 0;

for i = 1: n-1

temp=distance;

id1=find(visited==1); %查詢已經標號的點

temp(id1)=inf; %已標號點的距離換成無窮

[t, u] = min(temp); %找標號值最小的頂點

visited(u) = 1; %標記已經標號的頂點

id2=find(visited==0); %查詢未標號的頂點

for v = id2

if a(u, v) + distance(u) < distance(v)

distance(v) = distance(u) + a(u, v); %修改標號值

parent(v) = u;

endend

endmypath = ;

if parent(db) ~= 0 %如果存在路!

t = db; mypath = [db];

while t ~= sb

p = parent(t);

mypath = [p mypath];

t = p;

endend

mydistance = distance(db);

return

單源最短路 Dijkstra演算法

前提 沒有負邊 如果有負邊,可以用此方法檢查是否有負圈 const max v max v 表示邊的權重值 d max v 儲存從起點到每個點的總權重值 bool used max v 表示當前點是否已經訪問完畢 思想 找到乙個已經確定最短距離的點,更新跟它相鄰的點,之後這個點就不用關心了。起點最短...

單源最短路演算法 Dijkstra

dijkstra演算法是單源最短路演算法,可以求解不帶負權邊的圖中,從源點s到其它所有點的最短路。時間複雜度近似o n 2 可以用堆優化。一般用鄰接表,也可用鄰接矩陣。在稠密圖上會有較好的效能表現。include include using namespace std int s,t,n,m,las...

單源最短路 Dijkstra演算法

本文 自王陸的文字,僅作學習使用。dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。問題描述 在無向圖 g v,e 中,假設每條邊 e i 的長度為 w i 找到由頂點 v0 到...