如何用C++编写广度优先搜索的代码

How to write code for Breadth-first search in C++

本文关键字:广度优先搜索 代码 何用 C++      更新时间:2023-10-16

我一直在尝试对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大小,或者在将其放入列表之前减小uv

您还可以使用(无序的)映射将顶点映射到不会分段的列表。

也不是说VLA不是标准C++的一部分,所以即使编译器支持它们作为扩展,也要避免使用它们。