我尝试了cormen为bfs指定的算法,

代码是:

    bfs(int s){
     int i;
     int u,v;
     struct edge *e;
     graph[s].colour=1;
     graph[s].d=0;
     graph[s].pre=-1;

enqueue(s);
while (isempty()!=1){
    u=dequeue();
    printf("%d\t",u);
    e=graph[u].edgePtr;
    while(e!=NULL)
    {
        v=e->vertexIndex;
        if(graph[v].colour==WHITE){
            graph[v].colour=GRAY;
            graph[v].d=graph[u].d+1;
            graph[v].pre=u;

            enqueue(v);
            e=e->edgePtr;
        }
        graph[u].colour=BLACK;
    }
}
 }


我遇到了无限循环...有人可以告诉我我到底在哪里出错吗?

最佳答案

您混淆了结束的}。因此,如果颜色为WHITE,则仅移动到下一个边缘;如果u的颜色为非-WHITE,则在无限循环中停留在同一边缘上。正确的格式应如下所示:

bfs(int s){
  // …
  while (isempty()!=1){
    u=dequeue();
    // …
    while(e!=NULL) {
      v=e->vertexIndex;
      if (graph[v].colour==WHITE){
        graph[v].colour=GRAY;
        graph[v].d=graph[u].d+1;
        graph[v].pre=u;

        enqueue(v);
      } // end if WHITE
      e=e->edgePtr; // update e for all colours!
    } // end loop over all edges e
    graph[u].colour=BLACK;
  } // end loop while queue is not empty
} // end function

关于c - 使用cormen给出的算法在c中进行广度优先搜索,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15542186/

10-10 20:36