2016-03-31 10 views
0

Hackerrankから問題のグ​​ラフ検索を試みています。最後に、私はC++で幅優先検索のコードを書く方法

#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; 
} 

が出ているが、これは「セグメンテーション違反」が生じていると私は私が間違っているつもりですどこを見つけ出すことはできません。 また、セグメンテーションフォールトには多くの時間がかかりますが、どのようにデバッグするのか分かりません。誰かが私にそれのアイデアを与えることができれば素晴らしいだろう。

+1

デバッガを使用し、segfaultの時点でスタックトレースを確認します。 –

答えて

0
scanf("%d%d", &countVertices,&countEdges); 
list<int> adjacencyList[countVertices]; 

上記のコードは間違っています。インデックスが1で始まる場合は、のadjacencyListを作成するか、リストに入れる前にuvを減らしてください。

また、(順序付けられていない)マップマッピング頂点をセグメンテーションしないリストに使用することもできます。

また、VLAは標準のC++には含まれていないので、コンパイラがそれらを拡張子としてサポートしていても避けてください。

関連する問題