BFS遍历,同一个节点被访问两次

BFS traversal, same node being accessed twice

我想知道如何用 C 语言编写 BFS 算法 我得到了这个

typedef struct graph {
   int numnodes;
   int **edges;
} graph;

void bfs(graph *g, int start) {
   int visited[g->numnodes], queue[g->numnodes], front =- 1, rear =- 1;

   for (int i = 0; i < g->numnodes; i++) {
      visited[i] = 0;
   }

   front++;
   queue[++rear] = start;
   visited[start] = 1;

   while (front <= rear) {
      start = queue[front++];
      printf("%d\t", start);
      for (int i = 0; i < g->numnodes; i++) {
         if (g->edges[start][i] == 1 && !visited[i]) {
            queue[++rear] = i;
         }
      }
   }
}

图表看起来像 graph。 当我打印出 BFS 时,它似乎给了我 0 1 2 2 3 4

我不完全确定这里出了什么问题,如果您能提供帮助,我们将不胜感激。

创建一个实际的图并遍历它(例如,每个节点的结构,通过指针链接的节点)。现在你拥有的是一个数组,如果我理解正确的话,你可以逐项浏览它。 您可以使用数组来存储图形的一个级别。 0(一级) 2 1(二级) ...

我不确定 BFS 是否适合您所做的事情。您的图表不是树,并且节点具有多个父节点,因此很难判断节点的真实级别。

但是为了使您的代码按预期工作,您只需要修复缺少的 visited 数组的使用:

        if (g->edges[start][i] == 1 && !visited[i]) {
            queue[++rear] = i;
            visited[i] = 1;
        }