Ο ψευδο-κώδικας θυμίζει Algol, Pascal ή Ada.
Μήπως αυτό σημαίνει ότι πρέπει να εφαρμόσει ένα άλλο αλγόριθμο που βρίσκει το A k μήτρα;
Μια k φαίνεται να είναι μια λίστα των συστοιχιών των τιμών εισόδου που έχει τον συγκεκριμένο ιδιότητες. Μπορεί να σχετίζεται με το αντίστοιχο πίνακας γειτνίασης , αλλά δεν είναι σαφές για μένα. Υποθέτω κάτι σαν αυτό:
int[][] a = new int[k][n];
int[][] b = new int[k][n];
boolean[] blocked = new boolean[n];
int s;
Τι logical fσημαίνει αυτό;
Αυτό δηλώνει μια τοπική μεταβλητή που αντιπροσωπεύει ένα trueή falseαξία, παρόμοια με της Java boolean.
logical procedure CIRCUIT (integer value v);
Αυτό δηλώνει ένα υποπρόγραμμα που ονομάζεται CIRCUITέχει ένα μόνο ακέραιο παράμετρο vπου έχει περάσει από την αξία. Το υποπρόγραμμα επιστρέφει ένα logicalαποτέλεσμα trueή falseκαι CIRCUIT := fεκχωρεί fως αποτέλεσμα. Στην Java,
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;
}
}
}
}