我正在尝试一种遍历有向图的方法,并且所有顶点都是灰色或黑色,如果变为黑色,则将根标记为黑色,并表示它不会生成树。这一直给我一个堆栈溢出错误。我希望它即使遇到黑色也仍继续进行深度搜索,以免在此之后不会丢失任何内容。
void colorRoots(Vertex root, Vertex v) {
if (v.getColor() == DiGraph.BLACK) {
root.setColor(DiGraph.BLACK);
}
for (Vertex g : v.neighbors()) {
if (g.getColor() == DiGraph.GREY || g.getColor() == DiGraph.BLACK) {
colorRoots(root, g);
}
}
}
这是我用来遍历每个根并着色的方法。因此,我在使用根调用上述方法之前先调用此方法。
void dfs(Vertex v) {
if(v.getColor()==DiGraph.GREY) {
v.setColor(DiGraph.BLACK);
}else {
v.setColor(DiGraph.GRAY);
}
for (Vertex g : v.neighbors()) {
if(g.getColor()==DiGraph.WHITE || g.getColor()==DiGraph.GREY) {
dfs(g);
}
}
}
问题可能出在dsf方法中吗?
我脑海中的整个计划是从所有潜在的根中遍历一次图,然后再次进行遍历,并将所有不能产生树的根标记为黑色。
答案 0 :(得分:1)
检查在dfs中拼写为“ GRAY”和“ GREY”的方式可能是问题所在。
答案 1 :(得分:0)
在dfs(g)
循环上的递归调用似乎没有逻辑上的终点。每个已处理的顶点对象都调用neighbors()
,每个邻居Vertex
都调用邻居,每个被调用的邻居都调用邻居……等等。
答案 2 :(得分:0)
通过将DSF更改为
void dfs(Vertex v) {
v.setColor(DiGraph.GREY);
for (Vertex g : v.neighbors()) {
if(g.getColor()==DiGraph.WHITE) {
dfs(g);
}
}
v.setColor(DiGraph.BLACK);
}
似乎可以解决问题。