这是针对给定的无向图的作业问题,如果它是2可着色的,则将其着色,如果不是,则在其中输出一些奇数长度的循环。这个方法经过,着色,如果它找到一个循环,它会弹回堆栈并输出循环。它适用于小输入,但在大输入时会产生堆栈溢出错误。我有什么办法可以让它不会因为大输入而溢出吗?
P.S。我知道我应该对Node中的变量使用getter和setter方法。 Children是具有给定节点边缘的所有节点的列表。
public static boolean isOddLoop(Node current){
for(int x=0; x<current.children.size(); x++){
Node next = current.children.get(x);
if(next.color==0){ //i.e. is unvisited
next.color=3-current.color; //colors are 1 and 2, so this sets it to the opposite
if(isOddLoop(next)){
System.out.println(current.number + ": " + current.color);
return true;
}
}
if(next.color==current.color){
System.out.println(next.number + ": " + next.color);
System.out.println(current.number + ": " + current.color);
return true;
}
}
return false;
}
答案 0 :(得分:1)
正如上面的评论所说,增加分配给JVM堆栈的内存肯定会缓解这个问题。请在此处查看此帖子,以获取Java stack overflow error - how to increase the stack size in Eclipse?
的帮助我认为更好的解决方案是切换到BFS而不是DFS。使用BFS也是2着色问题的有效解决方案。此外,BFS可以使用队列完成,而不是递归。然后,你有一个小得多的堆栈,而不是你的堆大小限制。请注意,由于您不再拥有用于跟踪父节点的堆栈,因此您需要在节点类中为父节点添加指针并随时更新它。