Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在DFS堆栈中输入两次顶点_C_Graph_Stack - Fatal编程技术网

C 在DFS堆栈中输入两次顶点

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

在无向图中调试DFS的实现时遇到问题

在运行期间,顶点1在堆栈中输入了两次,我真的不知道为什么会发生这种情况

我在这里附加我的函数:

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的索引是无效的。无论如何,如果你对这个算法有问题,我建议你写一个单独的问题,评论不是进行此类讨论的好地方。