CS153/hw6/hw5programs/sp22_tests/toposort.oat
jmug ee01a8f5b2 Change hw6 to an unsolved version.
Signed-off-by: jmug <u.g.a.mariano@gmail.com>
2025-01-24 23:10:01 -08:00

94 lines
No EOL
2.5 KiB
Text

struct Node {
int id;
Node?[] neighbors
}
struct Elt {
Node node;
Elt? below
}
struct Stack {
Elt? top
}
void print_int_array(int[] arr) {
for (var i = 0; i < length(arr); i = i + 1;) {
print_int(arr[i]);
print_string(" ");
}
return;
}
void visit(bool[] visited, Node? nt, Stack s) {
if? (Node n = nt) {
if (visited[n.id]) {
return;
} else {
visited[n.id] = true;
s.top = new Elt { node = n; below = s.top};
var len = length(n.neighbors);
for (var i = 0; i < len ; i = i + 1;) {
visit(visited, n.neighbors[i], s);
}
}
}
return;
}
/* We assume that all nodes are reachable by root */
Stack? toposort(int n, Node? rootp) {
if? (Node root = rootp) {
var s = new Stack { top = new Elt { node = root; below = Elt null} };
var visited = new bool[n];
visit (visited, root, s);
return s;
}
return Stack null;
}
int[] order(int n, Stack? s) {
if? (Stack st = s) {
if? (Elt e = st.top) {
var ret = new int[n];
var idx = n - 1;
var loop = true;
while (loop) {
if? (Elt e2 = e.below) {
ret[idx] = e.node.id;
e = e2;
idx = idx - 1;
if (idx < 0) {
loop = false;
}
} else {
loop = false;
}
}
return ret;
}
}
return new int[n];
}
int program (int argc, string[] argv) {
var n0 = new Node { id = 0; neighbors = new Node?[7] };
var n1 = new Node { id = 1; neighbors = new Node?[7] };
var n2 = new Node { id = 2; neighbors = new Node?[7] };
var n3 = new Node { id = 3; neighbors = new Node?[7] };
var n4 = new Node { id = 4; neighbors = new Node?[7] };
var n5 = new Node { id = 5; neighbors = new Node?[7] };
var n6 = new Node { id = 6; neighbors = new Node?[7] };
n0.neighbors[0] = n1;
n0.neighbors[1] = n2;
n0.neighbors[2] = n3;
n1.neighbors[0] = n4;
n1.neighbors[1] = n5;
n2.neighbors[0] = n5;
n3.neighbors[0] = n6;
n4.neighbors[0] = n6;
var s = toposort(7, n0);
var o = order(7, s);
print_int_array(o);
return 0;
}