我正在尝试使用Java语言实现递归的深度优先搜索图。
假设
图表用邻接列表表示。
GraphSearchImpl是一种存储访问结果的数据结构。
GraphSearchImpl包含存储每个顶点的数组,开始/结束时间,访问状态(UNDISCOVERED,DISCOVERED,CLOSED),路径权重等等。
所有顶点都有一个映射在HashMap中的唯一索引,其中String是每个顶点的唯一标签。我正在使用此索引读取/写入指定顶点的数组单元格。
代码
public void visitDFSRecursive(GraphSearchImpl search,VertexImpl u,Integer time) {
int index = search.getIndexOf(u);
search.status[index]=VertexImpl.DISCOVERED;
time++;
search.startTimes[index]=time;
for (VertexImpl v: u.getAdjList()) {
int adjIndex = search.getIndexOf(v);
if (search.status[adjIndex]==VertexImpl.UNDISCOVERED) {
search.status[adjIndex]=VertexImpl.DISCOVERED;
search.parents[adjIndex]=u;
visitDFSRecursive(search,v,time);
}
}
search.status[index]=VertexImpl.CLOSED;
time++;
search.endTimes[index]=time;
}
我在这个方法上调用了这个方法,只用了两个节点(A - > B):
g.visitDFSRecursive(search,sourceVertex,new Integer(0));
输出如下:
-A从1开始以2
开始-B从2开始在3
这显然是错误的,因为B的开始/结束的时间间隔必须包含在A的一个中,因为B是该图中A的儿子。
我知道问题是我没有正确使用时间计数器。
请建议。
答案 0 :(得分:0)
问题是time
是一个局部变量,因此当您在递归中递增它时,time
的{{1}}不会受到影响。您应该将其转换为全局/静态变量,或者创建一个整数包装类并将其传递给一个可变对象。