我尝试了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/