C 在DFS堆栈中输入两次顶点
在无向图中调试DFS的实现时遇到问题 在运行期间,顶点1在堆栈中输入了两次,我真的不知道为什么会发生这种情况 我在这里附加我的函数:C 在DFS堆栈中输入两次顶点,c,graph,stack,C,Graph,Stack,在无向图中调试DFS的实现时遇到问题 在运行期间,顶点1在堆栈中输入了两次,我真的不知道为什么会发生这种情况 我在这里附加我的函数: void dfsFromMatrix(uint64_t **matrix, unsigned vertexes, unsigned root) { unsigned *markedItems; stack *stackPointer; unsigned tempVertex; unsigned i; markedItems
void dfsFromMatrix(uint64_t **matrix, unsigned vertexes, unsigned root) {
unsigned *markedItems;
stack *stackPointer;
unsigned tempVertex;
unsigned i;
markedItems = (unsigned *) calloc(vertexes, sizeof(unsigned));
stackPointer = NULL;
stackPointer = stackPush(stackPointer, root);
while (!checkIfStackIsEmpty(stackPointer)) {
tempVertex = stackPointer -> data;
#ifdef _DEBUG_
printf("tempVertex = %u\n", tempVertex);
#endif
stackPointer = stackPop(stackPointer);
if (!markedItems[tempVertex]) {
markedItems[tempVertex] = 1;
#ifdef _DEBUG_
printf("DFS: Marquei o vértice %u\n", tempVertex);
printStack(stackPointer);
#endif
for (i = 1 ; i <= vertexes ; i++)
if (getValueFromMatrix(matrix, tempVertex, i)) {
stackPointer = stackPush(stackPointer, i);
printf("Entrei na fila: %u\n", i);
}
}
}
}
void dfsFromMatrix(uint64\u t**matrix,无符号顶点,无符号根){
未签名*markedItems;
堆栈*堆栈指针;
无符号顶点;
未签名的i;
markedItems=(无符号*)calloc(顶点,sizeof(无符号));
stackPointer=NULL;
stackPointer=stackPush(stackPointer,root);
而(!checkIfStackIsEmpty(stackPointer)){
tempVertex=堆栈指针->数据;
#ifdef_调试_
printf(“tempVertex=%u\n”,tempVertex);
#恩迪夫
stackPointer=stackPop(stackPointer);
如果(!markedItems[tempVertex]){
markedItems[tempVertex]=1;
#ifdef_调试_
printf(“DFS:Marquei o vértice%u\n”,tempVertex);
打印堆栈(堆栈指针);
#恩迪夫
对于(i=1;i以一个顶点为循环边的图为例。您的算法推送根,标记它,然后继续推送所有连接到它的顶点,而不检查它们是否被标记。唯一的顶点连接到它自己,因此第二次推送它
标准DFS算法仅推送未标记的顶点:
pop top vertex T
for all vertex V connected to T
if V is not marked
mark V
push V
process V
pop top vertex T
if T is not marked
mark T
for all vertex V connected to T
push V
process V
注意标记、推送和处理都是同时完成的。在您的例子中,处理阶段只是打印出顶点,但它可以是任何东西
您的算法将推送连接到未标记顶点的顶点:
pop top vertex T
for all vertex V connected to T
if V is not marked
mark V
push V
process V
pop top vertex T
if T is not marked
mark T
for all vertex V connected to T
push V
process V
在您的版本中,标记和推送是分开的。如果将流程阶段移到标记阶段旁边,而不是推送阶段旁边,则可能会起作用
pop top vertex T
if T is not marked
mark T
process T
for all vertex V connected to T
push V
标准算法是首选的,因为它通常应该稍快一些。什么是DFS?它似乎与标记DFS
不同。我正试图实现你所说的,但我失败得很惨。我已经做到了:for(I=1;我想你错过了循环和数组在C中的工作方式。试试for(i=0;i<顶点;i++)
。我用I=1来解释这个问题,这让这个人很困惑。请永远不要这样做。C索引已经使用了40多年。它是有效的。基于1的索引是无效的。无论如何,如果你对这个算法有问题,我建议你写一个单独的问题,评论不是进行此类讨论的好地方。