2016-05-24 9 views
2

私はすでに同様の質問があることを知っていますが、私は自分の検索方法を評価したいと思います。私は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を行いました。今はこれがうまくいくと思います。

+1

円検出を追加する必要があります。 – Henry

+2

DFSではなくBFSを使用しています –

+0

グラフにサイクルが含まれている場合(またはエッジが「双方向」の場合)、つまりuがv.getAdjacent()でvがu.getAdjacent()にある場合は、関数が永遠にループする可能性があります。 OTOHのグラフがフォレスト(ツリーの集合)である場合、正しい答えで終了します。 –

答えて

4

このコードは、多くの入力グラフに対して無限ループに入ります。

A->B 
A->C 
C->A 

あなたのコードでは、まず、次にCを訪問し、リストの上にプッシュし、その後、Cを押して、リストの上にBを押して、します:

はエッジがあるとき、AからBへのルートを見つけることを検討しますスタックのオーバーフローが発生するまで繰り返します。

あなたはwikipedia

1 procedure DFS(G,v): 
2  label v as discovered 
3  for all edges from v to w in G.adjacentEdges(v) do 
4   if vertex w is not labeled as discovered then 
5    recursively call DFS(G,w) 

と比較した場合、あなたは新しい頂点が既に発見されていないことを確認するためのテストが欠落していることがわかります。

+0

OK、訪問したノードの保存トラックを追加して、複数回展開されないようにしました。これは現在OKですか?元の質問には編集があります。 – Whizzil

+1

それはちょうど場合のためにいくつかの単体テストを書くことを傷つけることはありませんが、それは私にはるかに良く見えます... –

関連する問題