我正在尝试编写一个算法来确定图形是否连接。我认为我的代码几乎是正确的,尽管我不断收到 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 是我开始的某个节点,nodes 是节点的 ArrayList,并且与访问的数组具有相同的大小(在本例中为 5)。在开始访问看起来像这样:[假假假假假假],所以没有节点被访问。listOfChildren() 返回特定节点的子节点(不是所有子节点,只是与节点相邻的子节点)的 ArrayList。我确信 listOfChildren() 有效,因为我测试了 43545454 次。
任何帮助表示赞赏(如果可能的话,对代码进行最少的更改)。谢谢。
更新:
我的图表是有向的..
我定义访问是这样的:
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) 用于访问的数组。
更新2:
这是图表的样子:
我确定问题出在 N3 之后,算法在 N3 之后循环,因为它不知道 N1 已经被访问过。我真的不明白为什么会这样!
更新3
字符串具有不同的名称并且没有重复项.. 例如 indexOf(nodes.get(2)) 给出 2 而不是 0 或其他任何内容..
问题是在访问 N3 之后,算法应该停止并返回 0 或 1,但我不知道该怎么做 :)