我试图通过使用堆栈实现迭代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循环中的目标标签匹配,并且准确性下降。
答案 0 :(得分:0)
你可以更具体地说明什么不起作用?
我在访问顺序中看到了2个变化:
递归算法以1 ... n的顺序访问邻居,而迭代将它们推送到堆栈,然后以相反的顺序n..1弹出它们。
递归算法在推送时将节点标记为已访问。递归变体将其标记为稍后访问。对应弹出的时间。
此外,recurse算法在迭代比较标签时检查节点是否相等。
vertexCurrent->label == destination->label
VS
currVert == destination