迭代DFS算法与递归不匹配

时间:2015-06-05 05:20:45

标签: c depth-first-search

我试图通过使用堆栈实现迭代DFS算法来确定图中的两个节点是否已连接。但是,为了测试我的解决方案的准确性,我针对用作基线的递归算法运行它。我的算法匹配递归解决方案大约75%,但我无法确定为什么它没有得到完全相同的结果。

struct Vertex {
    char label;
    int isVisited; // 0 if not yet visited, 1 if yes

    int numNeighbors;
    struct Vertex** neighbors; //list of neighbors of the vertex
};
typedef struct Vertex Vertex;

struct Graph {
    int numEdges;
    int numVertices;
    Vertex* vertexSet;
};
typedef struct Graph Graph;

struct DLink {
  TYPE value;
  struct DLink * next;
  struct DLink * prev;

};

struct cirListDeque {
  int size;
  struct DLink *last;
};

typedef struct cirListDeque cirListDeque;

下面是我尝试使用cirListDeque作为堆栈实现DFS搜索:(尝试查找源和目标之间是否存在路径)

int DFS(Graph* g, Vertex* source, Vertex* destination)
{
    /*Need a stack for a depth-first search*/
    cirListDeque stack;
    TYPE vertexCurrent;

    initCirListDeque(&stack);
    addBackCirListDeque(&stack, source);

    while (!isEmptyCirListDeque(&stack))
    {
        //Pop top of the stack
        vertexCurrent = backCirListDeque(&stack);
        removeBackCirListDeque(&stack);


        if (vertexCurrent->label == destination->label)
            return 1;

        for (int i = 0; i < vertexCurrent->numNeighbors; i++)
        {
            if (vertexCurrent->neighbors[i]->label == destination->label)
                return 1;

            if (vertexCurrent->neighbors[i]->isVisited == 0)
            {
                addBackCirListDeque(&stack, vertexCurrent->neighbors[i]);
                vertexCurrent->neighbors[i]->isVisited = 1;
            }
        }
    }

    return 0;
}

我知道它一定有问题,因为我在这个递归DFS算法上进行了测试,并且它并没有完全匹配。我知道问题在于我的解决方案,因为他们正在处理同一个图表。

int DFSRecursiveHelper(Graph* g, Vertex* currVert, Vertex* destination)
{
    int i;

    currVert->isVisited = 1;
    if(currVert == destination)
        return 1;
    for(i = 0; i < currVert->numNeighbors; ++i)
        if(!currVert->neighbors[i]->isVisited)
            if(DFSRecursiveHelper(g, currVert->neighbors[i], destination))
                return 1;
    return 0;
}
int DFSRecursive(Graph* g, Vertex* source, Vertex* destination)
{
    clearVisited(g);
    return DFSRecursiveHelper(g, source, destination);
}

有人能指出我的错误吗?我还试图不检查邻居的标签是否与for循环中的目标标签匹配,并且准确性下降。

1 个答案:

答案 0 :(得分:0)

你可以更具体地说明什么不起作用?

我在访问顺序中看到了2个变化:

  1. 递归算法以1 ... n的顺序访问邻居,而迭代将它们推送到堆栈,然后以相反的顺序n..1弹出它们。

  2. 递归算法在推送时将节点标记为已访问。递归变体将其标记为稍后访问。对应弹出的时间。

  3. 此外,recurse算法在迭代比较标签时检查节点是否相等。

    vertexCurrent->label == destination->label
    

    VS

    currVert == destination