图:DFS访问和Java实现

时间:2018-06-05 13:45:31

标签: java recursion graph depth-first-search

我正在尝试使用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的儿子。

我知道问题是我没有正确使用时间计数器。

请建议。

1 个答案:

答案 0 :(得分:0)

问题是time是一个局部变量,因此当您在递归中递增它时,time的{​​{1}}不会受到影响。您应该将其转换为全局/静态变量,或者创建一个整数包装类并将其传递给一个可变对象。