
伪代码让人想起Algol,Pascal或Ada。
这是否意味着我必须实施另一种找到A k矩阵的算法?
甲ķ似乎是具有指定属性的输入值的阵列的列表。它可能与相应的邻接矩阵有关,但我不清楚。我猜是这样的:
int[][] a = new int[k][n];int[][] b = new int[k][n];boolean[] blocked = new boolean[n];int s;
什么
logical f意思
这声明了一个表示a
true或
false值的局部变量,类似于Java的
boolean。
logical procedure CIRCUIT (integer value v);
这将声明一个子程序
CIRCUIT,该子程序具有一个
v按值传递的单个整数参数。子程序返回或的
logical结果,并将其分配为结果。在Java中,
true``false``CIRCUIT:= f``f
boolean circuit(int v) { boolean f; ... f = false; ... return f;}关键字
begin和
end定界可能嵌套的块作用域,因此
CIRCUIT嵌套在主块中,
UNBLOCK并嵌套在中
CIRCUIT。
:=是分配;
¬是
not;
∈是元素;
∅是空的;
≠是
!=;
stack并
unstack建议
push和
pop。
这只是一个开始,但我希望对您有所帮助。
附录:在反思,
A并且
B必须是同构的。
这是一个 非常字面的 轮廓。我对&的了解不足
A,无法选择比数组更好的数据结构。
B``V
import java.util.Stack;public final class CircuitFinding { static int k, n; int[][] a = new int[k][n]; int[][] b = new int[k][n]; boolean[] blocked = new boolean[n]; int[] v = new int[k]; int s = 1; Stack<Integer> stack = new Stack<Integer>(); private void unblock(int u) { blocked[u] = false; for (int w : b[u]) { //delete w from B(u) if (blocked[w]) { unblock(w); } } } private boolean circuit(int v) { boolean f = false; stack.push(v); blocked[v] = true; L1: for (int w : a[v]) { if (w == s) { //output circuit composed of stack followed by s; f = true; } else if (!blocked[w]) { if (circuit(w)) { f = true; } } } L2: if (f) { unblock(v); } else { for (int w : a[v]) { //if (v∉B(w)) put v on B(w); } } v = stack.pop(); return f; } public void main() { while (s < n) { //A:= adjacency structure of strong component K with least //vertex in subgraph of G induced by {s, s+ 1, n}; if (a[k] != null) { //s := least vertex in V; for (int i : v) { blocked[i] = false; b[i] = null; } L3: circuit(s); s++; } else { s = n; } } }}