FormationControlSimulation/SOURCE/networks-toolbox/dijkstra.m

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;