如何用C++编写广度优先搜索的代码
How to write code for Breadth-first search in C++
我一直在尝试对Hackerrank的一个问题进行图形搜索。最后,我提出了
#include <cstdio>
#include <list>
using namespace std;
void bfs(list<int> adjacencyList[], int start, int countVertices) {
// initialize distance[]
int distance[countVertices];
for(int i=0;i < countVertices; i++) {
distance[i] = -1;
}
list<int>::iterator itr;
int lev = 0;
distance[start-1] = lev; // distance for the start vertex is 0
// using start -1 since distance is array which are 0-indexed
list<int> VertexQueue;
VertexQueue.push_back(start);
while(!VertexQueue.empty()) {
int neighbour = VertexQueue.front();
itr = adjacencyList[neighbour].begin();
while(itr != adjacencyList[neighbour].end()) {
int vertexInd = (*itr) - 1;
if(distance[vertexInd] == -1) { // a distance of -1 implies that the vertex is unexplored
distance[vertexInd] = (lev + 1) * 6;
VertexQueue.push_back(*itr);
}
itr++;
}
VertexQueue.pop_front();
lev++;
}
// print the result
for(int k=0;k< countVertices;k++) {
if (k==start-1) continue; // skip the start node
printf("%d ",distance[k]);
}
}
int main() {
int countVertices,countEdges,start,T,v1,v2;
scanf("%d", &T);
for(int i=0; i<T; i++) {
scanf("%d%d", &countVertices,&countEdges);
list<int> adjacencyList[countVertices];
// input edges in graph
for(int j=0; j<countEdges; j++) {
scanf("%d%d",&v1,&v2);
adjacencyList[v1].push_back(v2);
adjacencyList[v2].push_back(v1); // since the graph is undirected
}
scanf("%d",&start);
bfs(adjacencyList, start, countVertices);
printf("n");
}
return 0;
}
然而,这导致了"分段错误",我无法弄清楚哪里出了问题。此外,我也遇到过很多次分段错误,但不知道如何调试。如果有人能告诉我这一点,那就太好了。
scanf("%d%d", &countVertices,&countEdges);
list<int> adjacencyList[countVertices];
上面的代码出现错误。如果索引以1
开头,请将adjacencyList
设置为countVertices + 1
大小,或者在将其放入列表之前减小u
和v
。
您还可以使用(无序的)映射将顶点映射到不会分段的列表。
也不是说VLA不是标准C++的一部分,所以即使编译器支持它们作为扩展,也要避免使用它们。
相关文章:
- 提升图广度优先搜索前置编译错误
- 使用openmp实现并行广度优先搜索
- 广度优先搜索陷入无限循环
- 并行化广度优先搜索
- 如何使用C 中的广度优先搜索解决8个式嘴问题
- 如何使用广度优先搜索确定是否可以在有向图中到达顶点
- 修改广度优先搜索算法以记住矩阵中的最短路径
- 如何实现广度优先搜索
- 图论:广度优先搜索
- 广度优先搜索未找到正确的路径
- 有向图中的广度优先搜索
- 使用Boost图库从多个来源进行广度优先搜索
- 如何用C++编写广度优先搜索的代码
- C++以广度优先搜索的方式查找多个数组中元素的所有组合
- 广度优先搜索:有向图
- 邻接列表,用于创建图形和广度优先搜索 (BFS) 和 Fepth First Search (DFS)
- 广度优先搜索中的 C++ 迭代器和指针用法
- 广度优先搜索输入
- 广度优先搜索返回错误的金额
- 是否可以将boost库的广度优先搜索算法应用于矩阵