about summary refs log tree commit diff
path: root/sourcecodes/bnt-master/graph/topological_sort.m
diff options
context:
space:
mode:
authorziejd22018-03-14 23:23:33 -0500
committerGitHub2018-03-14 23:23:33 -0500
commit1ff6baa44e22b91eefb48aea6f3befa078c0489b (patch)
treee0fd79d2e32fd2aedda2eadaed0f19af3514c520 /sourcecodes/bnt-master/graph/topological_sort.m
parent6882395afdadf4e982b25b5215071a0932730950 (diff)
parentc80226899f5cdd9f11c163817d59445213f5bef0 (diff)
downloadBNW-1ff6baa44e22b91eefb48aea6f3befa078c0489b.tar.gz
Merge pull request #1 from ziejd2/octave_php_separate
Octave php separate
Diffstat (limited to 'sourcecodes/bnt-master/graph/topological_sort.m')
-rw-r--r--sourcecodes/bnt-master/graph/topological_sort.m30
1 files changed, 30 insertions, 0 deletions
diff --git a/sourcecodes/bnt-master/graph/topological_sort.m b/sourcecodes/bnt-master/graph/topological_sort.m
new file mode 100644
index 00000000..cd8b8325
--- /dev/null
+++ b/sourcecodes/bnt-master/graph/topological_sort.m
@@ -0,0 +1,30 @@
+function order = topological_sort(A)
+% TOPOLOGICAL_SORT Return the nodes in topological order (parents before children).
+% order = topological_sort(adj_mat)
+
+n = length(A);
+indeg = zeros(1,n);
+zero_indeg = []; % a stack of nodes with no parents
+for i=1:n
+  indeg(i) = length(parents(A,i));
+  if indeg(i)==0
+    zero_indeg = [i zero_indeg];
+  end
+end
+
+t=1;
+order = zeros(1,n);
+while ~isempty(zero_indeg)
+  v = zero_indeg(1); % pop v
+  zero_indeg = zero_indeg(2:end);
+  order(t) = v;
+  t = t + 1;
+  cs = children(A, v);
+  for j=1:length(cs)
+    c = cs(j);
+    indeg(c) = indeg(c) - 1;
+    if indeg(c) == 0
+      zero_indeg = [c zero_indeg]; % push c 
+    end
+  end
+end