wolffd@0: function order = topological_sort(A) wolffd@0: % TOPOLOGICAL_SORT Return the nodes in topological order (parents before children). wolffd@0: % order = topological_sort(adj_mat) wolffd@0: wolffd@0: n = length(A); wolffd@0: indeg = zeros(1,n); wolffd@0: zero_indeg = []; % a stack of nodes with no parents wolffd@0: for i=1:n wolffd@0: indeg(i) = length(parents(A,i)); wolffd@0: if indeg(i)==0 wolffd@0: zero_indeg = [i zero_indeg]; wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: t=1; wolffd@0: order = zeros(1,n); wolffd@0: while ~isempty(zero_indeg) wolffd@0: v = zero_indeg(1); % pop v wolffd@0: zero_indeg = zero_indeg(2:end); wolffd@0: order(t) = v; wolffd@0: t = t + 1; wolffd@0: cs = children(A, v); wolffd@0: for j=1:length(cs) wolffd@0: c = cs(j); wolffd@0: indeg(c) = indeg(c) - 1; wolffd@0: if indeg(c) == 0 wolffd@0: zero_indeg = [c zero_indeg]; % push c wolffd@0: end wolffd@0: end wolffd@0: end