56 lines
1.5 KiB
Matlab
56 lines
1.5 KiB
Matlab
% Dijkstra's algorithm.
|
|
%
|
|
% INPUTS: adj - adjacency matrix (nxn), s - source node, target - target node
|
|
% OUTPUTS: distance, d and path, P (from s to target)
|
|
%
|
|
% Note: if target==[], then dist and P include all distances and paths from s
|
|
% Other routines used: adj2adjL.m
|
|
% GB: last updated, Oct 5, 2012
|
|
|
|
function [dist,P]=dijkstra(adj,s,target)
|
|
|
|
n=length(adj); % number of nodes
|
|
adjL=adj2adjL(adj); % list of neighbors
|
|
|
|
dist=inf(1,n); % initialize distances
|
|
dist(s)=0;
|
|
|
|
previous=[1:n; inf(1,n)]'; % {i: inf}, i=1:n, inf -> not assigned
|
|
S=cell(1,n); % initialize shortest path sequence
|
|
|
|
|
|
Q=[1:n]; % all unvisited vertices, entire graph
|
|
|
|
while length(Q)>0 % while not empty
|
|
|
|
% get min dist member among unvisited vertices
|
|
[mindist,min_ind]=min(dist(Q));
|
|
u=Q(min_ind);
|
|
|
|
% termination condition - save "source-u" path
|
|
S{u}=[];
|
|
t=u;
|
|
while not(isempty(find(previous(:,1)==t))) % t in previous.keys():
|
|
% insert u at the beginning of S
|
|
S{u}=[t S{u}];
|
|
t=previous(t,2);
|
|
end
|
|
if length(target)>0 && u==target
|
|
dist=dist(u); P=S{u};
|
|
return
|
|
end
|
|
|
|
% path book-keeping
|
|
Q = setdiff(Q,u); % remove u from Q
|
|
|
|
for v=1:length(adjL{u}) % across all neighbors of u
|
|
v=adjL{u}(v);
|
|
alt=dist(u)+adj(u,v);
|
|
if alt < dist(v) % update the distance and path
|
|
dist(v)=alt;
|
|
previous(v,2)=u;
|
|
end
|
|
end
|
|
end
|
|
|
|
P=S; |