Mercurial > hg > camir-aes2014
comparison toolboxes/FullBNT-1.0.7/graph/dijkstra.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e9a9cd732c1e |
---|---|
1 function [D,P] = dijk(A,s,t) | |
2 %DIJK Shortest paths from nodes 's' to nodes 't' using Dijkstra algorithm. | |
3 % [D,p] = dijk(A,s,t) | |
4 % A = n x n node-node weighted adjacency matrix of arc lengths | |
5 % (Note: A(i,j) = 0 => Arc (i,j) does not exist; | |
6 % A(i,j) = NaN => Arc (i,j) exists with 0 weight) | |
7 % s = FROM node indices | |
8 % = [] (default), paths from all nodes | |
9 % t = TO node indices | |
10 % = [] (default), paths to all nodes | |
11 % D = |s| x |t| matrix of shortest path distances from 's' to 't' | |
12 % = [D(i,j)], where D(i,j) = distance from node 'i' to node 'j' | |
13 % P = |s| x n matrix of predecessor indices, where P(i,j) is the | |
14 % index of the predecessor to node 'j' on the path from 's(i)' to 'j' | |
15 % (use PRED2PATH to convert P to paths) | |
16 % = path from 's' to 't', if |s| = |t| = 1 | |
17 % | |
18 % (If A is a triangular matrix, then computationally intensive node | |
19 % selection step not needed since graph is acyclic (triangularity is a | |
20 % sufficient, but not a necessary, condition for a graph to be acyclic) | |
21 % and A can have non-negative elements) | |
22 % | |
23 % (If |s| >> |t|, then DIJK is faster if DIJK(A',t,s) used, where D is now | |
24 % transposed and P now represents successor indices) | |
25 % | |
26 % (Based on Fig. 4.6 in Ahuja, Magnanti, and Orlin, Network Flows, | |
27 % Prentice-Hall, 1993, p. 109.) | |
28 | |
29 % Copyright (c) 1998-2001 by Michael G. Kay | |
30 % Matlog Version 5 22-Aug-2001 | |
31 | |
32 % Input Error Checking ****************************************************** | |
33 error(nargchk(1,3,nargin)); | |
34 | |
35 [n,cA] = size(A); | |
36 | |
37 if nargin < 2 | isempty(s), s = (1:n)'; else s = s(:); end | |
38 if nargin < 3 | isempty(t), t = (1:n)'; else t = t(:); end | |
39 | |
40 if ~any(any(tril(A) ~= 0)) % A is upper triangular | |
41 isAcyclic = 1; | |
42 elseif ~any(any(triu(A) ~= 0)) % A is lower triangular | |
43 isAcyclic = 2; | |
44 else % Graph may not be acyclic | |
45 isAcyclic = 0; | |
46 end | |
47 | |
48 if n ~= cA | |
49 error('A must be a square matrix'); | |
50 elseif ~isAcyclic & any(any(A < 0)) | |
51 error('A must be non-negative'); | |
52 elseif any(s < 1 | s > n) | |
53 error(['''s'' must be an integer between 1 and ',num2str(n)]); | |
54 elseif any(t < 1 | t > n) | |
55 error(['''t'' must be an integer between 1 and ',num2str(n)]); | |
56 end | |
57 % End (Input Error Checking) ************************************************ | |
58 | |
59 A = A'; % Use transpose to speed-up FIND for sparse A | |
60 | |
61 D = zeros(length(s),length(t)); | |
62 if nargout > 1, P = zeros(length(s),n); end | |
63 | |
64 for i = 1:length(s) | |
65 j = s(i); | |
66 | |
67 Di = Inf*ones(n,1); Di(j) = 0; | |
68 | |
69 isLab = logical(zeros(length(t),1)); | |
70 if isAcyclic == 1 | |
71 nLab = j - 1; | |
72 elseif isAcyclic == 2 | |
73 nLab = n - j; | |
74 else | |
75 nLab = 0; | |
76 UnLab = 1:n; | |
77 isUnLab = logical(ones(n,1)); | |
78 end | |
79 | |
80 while nLab < n & ~all(isLab) | |
81 if isAcyclic | |
82 Dj = Di(j); | |
83 else % Node selection | |
84 [Dj,jj] = min(Di(isUnLab)); | |
85 j = UnLab(jj); | |
86 UnLab(jj) = []; | |
87 isUnLab(j) = 0; | |
88 end | |
89 | |
90 nLab = nLab + 1; | |
91 if length(t) < n, isLab = isLab | (j == t); end | |
92 | |
93 [jA,kA,Aj] = find(A(:,j)); | |
94 Aj(isnan(Aj)) = 0; | |
95 | |
96 if isempty(Aj), Dk = Inf; else Dk = Dj + Aj; end | |
97 | |
98 if nargout > 1, P(i,jA(Dk < Di(jA))) = j; end | |
99 Di(jA) = min(Di(jA),Dk); | |
100 | |
101 if isAcyclic == 1 % Increment node index for upper triangular A | |
102 j = j + 1; | |
103 elseif isAcyclic == 2 % Decrement node index for lower triangular A | |
104 j = j - 1; | |
105 end | |
106 end | |
107 D(i,:) = Di(t)'; | |
108 end | |
109 | |
110 if nargout > 1 & length(s) == 1 & length(t) == 1 | |
111 P = pred2path(P,s,t); | |
112 end |