グラフが接続されているかどうかを判断するアルゴリズムを作成しようとしています。StackOverFlowErrorが発生し続けますが、コードはほぼ正しいと思います。個人的には、アルゴリズムをテストしているグラフにサイクルがあるため、コードはそれを理解せず、ループに陥っていると思います。しかし、私は配列を使用して、ノードがすでにアクセスされているかどうかを確認しています!だからそれは起こらないはずです!とにかくこれは私のコードです:
public int isConnected(String s)
{
int in = nodes.indexOf(s);
visited[in] = true;
counter++;
for(int i = 0; i < listOfChildren(s).size(); i++)
{
int ind = nodes.indexOf(listOfChildren(s).get(i));
if(visited[ind] == false)
{
isConnected(listOfChildren(s).get(i));
}
}
System.out.println(counter);
if(counter == nodes.size())
return 1;
return 0;
}
sは私が始めたノードであり、ノードはノードのArrayListであり、アクセスした配列と同じサイズ(この場合は5)です。最初に訪問したのは次のようになります:[false false false false false]、したがって、どのノードも訪問されませんでした。listOfChildren()は、特定のノードの子(すべてではなく、ノードに隣接する子のみ)のArrayListを返します。私は43545454回テストしたので、listOfChildren()が機能すると確信しています。
どんな助けでもありがたいです(可能であれば、コードの最小限の変更で)。ありがとう。
アップデート:
私のグラフは指示されています。
私はこのように訪問を定義します:
private boolean[] visited;
このコードでは、コンストラクターでその中のすべてをfalseに設定します。
public void setUnvisited()
{
visited = new boolean[nodes.size()];
for(int i = 0; i < nodes.size(); i++)
{
visited[i] = false;
}
}
ノードは文字列です!訪問済みノードとノードの長さは同じです。そのため、アクセスした配列にnodes.indexOf(blabla)を使用できます。
UPDATE2:
グラフは次のようになります。
問題はN3の後であると確信しています。アルゴリズムは、N1がすでにアクセスされていることを理解していないため、N3の後でループします。なぜこれが起こるのか本当にわかりません!
UPDATE3
文字列の名前は異なり、重複はありません。たとえば、indexOf(nodes.get(2))は0などではなく2を返します。
問題は、N3にアクセスした後、アルゴリズムが停止して0または1を返す必要があることですが、その方法がわかりません:)