簡體   English   中英

如何在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或減小uv

您也可以使用(無序)映射頂點映射到不會分段的列表。

同樣不是VLA不是標准C ++的一部分,因此即使您的編譯器支持將其作為擴展,也應避免使用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM