Я пытаюсь написать алгоритм, который определяет, связан ли граф или нет. Я думаю, что мой код почти правильный, хотя я продолжаю получать 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), что и посещаемый массив. Вначале посещенный выглядит так: [false false false false false], значит, ни один из узлов не был посещен. 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, но я не знаю, как это сделать :)
StackOverflowError
на самом деле бросается вlistOfChildren
? Если нет, то нужно вставитьSystem.err.println(s);
в начало метода и исследовать первый повтор. - person rlibby   schedule 20.02.2011visited
, возможно, вызываяsetUnvisited()
? - person rlibby   schedule 20.02.2011