Java 为什么在尝试使用此图查找强连接组件时会出现StackOverflowerError?

Java 为什么在尝试使用此图查找强连接组件时会出现StackOverflowerError?,java,graph,stack-overflow,depth-first-search,strongly-connected-graph,Java,Graph,Stack Overflow,Depth First Search,Strongly Connected Graph,我正在尝试编写一个算法来确定一个图是否是强连通的。我认为我的代码几乎是正确的,尽管我一直得到StackOverflower错误。我个人认为,因为在我测试算法的图形中有一个循环,所以我的代码不理解这一点,而是以循环的形式出现。但是我正在使用一个数组来查看是否已经访问了一个节点!所以这不应该发生!请帮助我理解我的代码有什么问题。无论如何,这是我的代码: static void dfs(int src,boolean[] visited,Stack<Integer> stack){

我正在尝试编写一个算法来确定一个图是否是强连通的。我认为我的代码几乎是正确的,尽管我一直得到StackOverflower错误。我个人认为,因为在我测试算法的图形中有一个循环,所以我的代码不理解这一点,而是以循环的形式出现。但是我正在使用一个数组来查看是否已经访问了一个节点!所以这不应该发生!请帮助我理解我的代码有什么问题。无论如何,这是我的代码:

 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);
    }
staticvoiddfs(int-src,boolean[]已访问,堆栈){
访问[src]=真;
for(整数i:adj[src]){
如果(!访问[i]){
dfs(i、访问、堆栈);
}
}
堆栈推送(src);
}
以下是我从main调用DFS函数的方式:

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);
        }
    }
Stack Stack=新堆栈();
布尔[]访问=新布尔[n+1];

对于(int i=1;i有两种可能的解释:

  • 有一个循环,你的循环检测代码不起作用
  • 图形太深;即,如果堆栈较大,代码将正常工作
  • 看看你的代码,我认为第二种解释是正确的


    示例:假设您的图形实际上是一行中由N个节点组成的链。要到达列表中的最后一个节点,您需要进行递归调用N deep。对于足够大的N,这将导致堆栈溢出。

    这可能会帮助您:您正在使用
    src
    更新
    访问的
    ,我猜这是节点号?哪里是
    g
    defined?
    if(!visted[i]){g.dfs(i,visted,stack);
    对我来说也不清楚:如果您想从每个可能的节点启动dfs,请忽略
    visted
    。请发布,这样我们就不需要猜测了。该问题的约束条件是:1≤ N≤ 10^5我认为这样的堆栈空间不够大,不足以导致堆栈溢出错误。有什么解决方案可以克服这种情况吗?@ShreyaJain您可以应用非递归dfs,或者每隔一段时间运行递归。请参阅“我认为这样的堆栈空间不够大,不足以导致堆栈溢出错误”的示例,我不知道。“有什么解决方案可以克服这种情况吗?”使用显式堆栈数据结构而不是递归。