私はすでに同様の質問があることを知っていますが、私は自分の検索方法を評価したいと思います。私はDFSアルゴリズムを使用して、2つのノード間にルートがあるかどうかを調べました。ここに私のコードがありますが、私のコードが結果で失敗するテストケースがあるかどうかを知りたいと思います。グラフ内に2つのノード間のルートがあるかどうかをテストします。
public boolean routeExists(Node start, Node end) {
Set<Node> visited = new HashSet<>();
Stack<Node> stack = new Stack<>();
visited.add(start);
stack.push(start);
while(!stack.isEmpty()) {
Node current = stack.pop();
if(current.getValue() == end.getValue()) {
return true;
}
for(Node adj : current.getAdjacent()) {
// keep track of visited nodes
if(!visited.contains(adj)) {
stack.push(adj);
visited.add(adj);
}
}
}
return false;
}
私は今、コードが訪れたノードを追跡し、彼らは過去に訪問してきた場合は、それらを展開しません、EDITを行いました。今はこれがうまくいくと思います。
円検出を追加する必要があります。 – Henry
DFSではなくBFSを使用しています –
グラフにサイクルが含まれている場合(またはエッジが「双方向」の場合)、つまりuがv.getAdjacent()でvがu.getAdjacent()にある場合は、関数が永遠にループする可能性があります。 OTOHのグラフがフォレスト(ツリーの集合)である場合、正しい答えで終了します。 –