C 中的 BFS 实现不会终止
BFS implementation in C doesn't terminate
这是我在 C 中实现的 BFS
void bfs(int* vertices, Edge* edges, int num_vertices, int num_edges){
int level = 0;
int modified;
//continue looping till all vertices have not been updated
do{
modified = 1;
for (int i = 0; i < num_edges; ++i)
{
int first = edges[i].first;
int second = edges[i].second;
if ((vertices[first] == level) &&(vertices[second] == -1))
{
vertices[second] = level + 1;
modified = 0;
}else if (vertices[second]== level && (vertices[first] == -1))
{
vertices[first] = level + 1;
modified = 0;
}
}//end of for
level++;
}while(modified != 0);
}
代码应该写入对应于顶点数组中的起始顶点的每个顶点的级别。使用此函数初始化数组。
void initialize_vertices(int* vertices, int size, int start_vertex){
for (int i = 0; i < size; ++i)
{
if(i == start_vertex){
vertices[i] = 0;
}else{
vertices[i] = -1;
}
}
}
一条边定义如下
typedef struct Edge{
int first;
int second;
}Edge;
这是我调用的主函数。
int main(int argc, char** argv){
const int NUM_VERTICES = 128;
const int NUM_EDGES = 128;
const int START_VERTEX = 25;
clock_t begin, end;
double time_spent;
int vertices[NUM_VERTICES];
Edge edges[NUM_EDGES];
//data set
for (int i = 0; i < NUM_EDGES; ++i)
{
edges[i].first = (rand() % (NUM_VERTICES+1));
edges[i].second = (rand() % (NUM_VERTICES+1));
}
initialize_vertices(vertices, NUM_VERTICES, START_VERTEX);
begin = clock();
bfs(vertices, edges, NUM_VERTICES, NUM_EDGES);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time taken: %f\n", time_spent);
for (int i = 0; i < NUM_VERTICES; ++i)
{
printf("%d : %d", i, vertices[i]);
printf(((i % 4) != 3) ? "\t":"\n");
}
return 0;
}
问题是代码永远不会终止。我做错了什么,感谢任何帮助。
如果您不修改任何内容,请重新进入循环。这似乎是你的问题。
您在循环开始时设置了 modified = 1
,只有在发生变化时才将其更改为 0
。当你最后问 modified != 0
它会 return true
当且仅当没有变化时。
你的 modified
逻辑有问题。
默认情况下,您将 modified
设置为 1
,我猜这意味着某些内容已被修改。
然后
}while(modified != 0);
如果有任何修改,则正确循环。
您想将 modified
初始设置为 0
并在内部 if
.
中将其更改为 1
这是我在 C 中实现的 BFS
void bfs(int* vertices, Edge* edges, int num_vertices, int num_edges){
int level = 0;
int modified;
//continue looping till all vertices have not been updated
do{
modified = 1;
for (int i = 0; i < num_edges; ++i)
{
int first = edges[i].first;
int second = edges[i].second;
if ((vertices[first] == level) &&(vertices[second] == -1))
{
vertices[second] = level + 1;
modified = 0;
}else if (vertices[second]== level && (vertices[first] == -1))
{
vertices[first] = level + 1;
modified = 0;
}
}//end of for
level++;
}while(modified != 0);
}
代码应该写入对应于顶点数组中的起始顶点的每个顶点的级别。使用此函数初始化数组。
void initialize_vertices(int* vertices, int size, int start_vertex){
for (int i = 0; i < size; ++i)
{
if(i == start_vertex){
vertices[i] = 0;
}else{
vertices[i] = -1;
}
}
}
一条边定义如下
typedef struct Edge{
int first;
int second;
}Edge;
这是我调用的主函数。
int main(int argc, char** argv){
const int NUM_VERTICES = 128;
const int NUM_EDGES = 128;
const int START_VERTEX = 25;
clock_t begin, end;
double time_spent;
int vertices[NUM_VERTICES];
Edge edges[NUM_EDGES];
//data set
for (int i = 0; i < NUM_EDGES; ++i)
{
edges[i].first = (rand() % (NUM_VERTICES+1));
edges[i].second = (rand() % (NUM_VERTICES+1));
}
initialize_vertices(vertices, NUM_VERTICES, START_VERTEX);
begin = clock();
bfs(vertices, edges, NUM_VERTICES, NUM_EDGES);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time taken: %f\n", time_spent);
for (int i = 0; i < NUM_VERTICES; ++i)
{
printf("%d : %d", i, vertices[i]);
printf(((i % 4) != 3) ? "\t":"\n");
}
return 0;
}
问题是代码永远不会终止。我做错了什么,感谢任何帮助。
如果您不修改任何内容,请重新进入循环。这似乎是你的问题。
您在循环开始时设置了 modified = 1
,只有在发生变化时才将其更改为 0
。当你最后问 modified != 0
它会 return true
当且仅当没有变化时。
你的 modified
逻辑有问题。
默认情况下,您将 modified
设置为 1
,我猜这意味着某些内容已被修改。
然后
}while(modified != 0);
如果有任何修改,则正确循环。
您想将 modified
初始设置为 0
并在内部 if
.
1