そのため、Graphクラスを作成しましたが、ノードのシーケンスによっては、深さ優先探索を適切に実行できないようです。これが私が意味することです:
私のグラフが次のようになっている場合:
A-B-D
|/
C
DFSは「ABC」を返します
しかし、それがこのように見えるとき:
A-B
| |
D C
|
E
ABCDEが正しく印刷されます。
私が見つけた問題は、getUnvisitedAdjacentNode()関数にあります。関数は次のとおりです。
public int getUnvisitedAdjacentNode(int n) {
for (int i = 0; i < this.nodeList.size(); i++) {
if (this.edges[n][i] == 1 && this.nodeList.get(i).wasVisited == false) {
return i;
}
}
return -1;
}
問題は、それが「順序」(forループのみ)になるためです。最初の状況では、Bが訪問され、Cが訪問された後、Bがスタックからポップされるため、Dをトラバースすることはありません。 。多分これは問題ではありません。
これが私の実際のDFSトラバーサルのコードです。
public void depthFirstTraverse() {
Stack<Node> stack = new Stack<Node>();
nodeList.get(0).wasVisited = true;
System.out.println(nodeList.get(0).item);
stack.push(nodeList.get(0));
while (!stack.isEmpty()) {
int nextNode = this.getUnvisitedAdjacentNode(stack.peek().index);
if (nextNode == -1) {
stack.pop();
} else {
nodeList.get(nextNode).wasVisited = true;
System.out.println(nodeList.get(nextNode).item);
stack.push(nodeList.get(nextNode));
}
}
for (int i = 0; i < nodeList.size(); i++) {
nodeList.get(i).wasVisited = false;
}
}