Почему я получаю StackOverFlowError при попытке DFS на этом графике найти сильно связанный компонент?
Я пытаюсь написать алгоритм, который определяет, сильно ли связан граф или нет. Я думаю, что мой код почти правильный, хотя я продолжаю получать StackOverFlowError. Я лично думаю, что из-за цикла в графе, с которым я тестирую свой алгоритм, мой код этого не понимает и зацикливается. Но я использую массив, чтобы увидеть, был ли узел уже посещен! Так что этого не должно случиться! Пожалуйста, помогите мне понять, что не так с моим кодом. В любом случае это мой код:
static void dfs(int src,boolean[] visited,Stack<Integer> stack){
visited[src]=true;
for(Integer i:adj[src]){
if(!visited[i]){
dfs(i,visited,stack);
}
}
stack.push(src);
}
Вот как я назвал свою функцию DFS из main:
Stack<Integer> stack=new Stack<Integer>();
boolean[] visited=new boolean[n+1];
for(int i=1;i<=n;i++){
if(!visited[i]){
g.dfs(i,visited,stack);
}
}
1 ответ
Есть два возможных объяснения:
- Есть цикл, и ваш код обнаружения цикла не работает.
- График слишком глубокий; т. е. ваш код работал бы, если бы стек был больше.
Глядя на ваш код, я думаю, что второе объяснение правильное.
Пример: предположим, что ваш граф на самом деле представляет собой цепочку из N узлов в строке. Чтобы добраться до последнего узла в списке, вам нужно совершать рекурсивные вызовы N в глубину. Для достаточно большого N это приведет к переполнению стека.