2016-12-07 12 views
0

Я новичок в stackoverflow, поэтому, пожалуйста, со мной.Как сделать неориентированный и невзвешенный график в форме сетки в C++

Я пытаюсь реализовать цикл for для инициализации графика в форме сетки, включая диагональ. В принципе, у меня есть массив, который инициализируется значениями, которые я хочу реплицировать на графике. Поэтому у меня есть вложенный цикл for, который содержит несколько операторов if. Операторы if используются для обработки особых случаев. Элемент в индексе 1,1 имеет только 3 соседства.

Я знаю, что моя функция графа работает, потому что, если я инициализирую ее вручную, она не отменит ошибку и не напечатает надлежащую BFS, но мои ошибки seg seg. Пожалуйста, обратите внимание:

Graph Класс:

Graph::Graph(int V) 
{ 
    this->V = V; 
    adj = new list<int>[V]; 

} 

void Graph::addEdge(int v, int w) 
{ 
    adj[v].push_back(w); // Add w to v’s list. 
} 

void Graph::BFS(int s, int d) 
{ 
    // Mark all the vertices as not visited 
    bool *visited = new bool[V]; 
    int trail[V]; 
    for(int i = 0; i < V; i++){ 
     visited[i] = false; 
     trail[i] = -1; 

    } 
    // Create a queue for BFS 
    list<int> queue; 

// Mark the current node as visited and enqueue it 
visited[s] = true; 
queue.push_back(s); 

// 'i' will be used to get all adjacent vertices of a vertex 
list<int>::iterator i; 

while(!queue.empty()) 
{ 

    // Dequeue a vertex from queue and print it 
    s = queue.front(); 
    if(s == d){ 

     break; 
    } 
    else 

    queue.pop_front(); 

    // Get all adjacent vertices of the dequeued vertex s 
    // If a adjacent has not been visited, then mark it visited 
    // and enqueue it 
    for(i = adj[s].begin(); i != adj[s].end(); ++i) 
    { 
     if(!visited[*i]) 
     { 
      visited[*i] = true; 
      queue.push_back(*i); 
      trail[*i] = s; 
     } 

    } 

} 
int x = d; 
while(x != -1){ 

    cout<<x<<endl; 
    x = trail[x]; 


    } 
} 

В основной программе:

int num = 2; 

int arr[num+1][num+1]; 
int x = 1; 
for(int i = 1; i<=num; i++){ 
    for(int j = 1; j<= num; j++){ 

     arr[i][j] = x; 


     cout<<x<<" "; 
     x++; 

    } 
    cout<<endl; 

} 

int max = 2; 
Graph g(max+1); 

for(int row = 1; row <= max; row++){ 

    for(int col = 1; col <= max; col++){ 

     if(row == 1 && col == 1){ 

      g.addEdge(arr[row][col],(arr[row][col] +1)); 
      g.addEdge(arr[row][col],(arr[row][col] +max)); 
      g.addEdge(arr[row][col],(arr[row][col] + max+1)); 

     } 
     else if(row ==1 && col == max){ 
      g.addEdge(arr[row][col],(arr[row][col]-1)); 
      g.addEdge(arr[row][col],(arr[row][col]+max)); 
      g.addEdge(arr[row][col],(arr[row][col]+max-1)); 


     } 

     else if(row == max && col == max){ 
      g.addEdge(arr[row][col],(arr[row][col]-1)); 
      g.addEdge(arr[row][col],(arr[row][col]-max)); 
      g.addEdge(arr[row][col],(arr[row][col]-max-1)); 

     } 
     else if(row == max && col == 1){ 
      g.addEdge(arr[row][col],(arr[row][col]-max)); 
      g.addEdge(arr[row][col],(arr[row][col]-max+1)); 
      g.addEdge(arr[row][col],(arr[row][col]+1)); 

     } 
     else if(row == max){ 
      g.addEdge(arr[row][col],(arr[row][col]-1)); 
      g.addEdge(arr[row][col],(arr[row][col]+1)); 
      g.addEdge(arr[row][col],(arr[row][col]-max)); 
      g.addEdge(arr[row][col],(arr[row][col]-max-1)); 
      g.addEdge(arr[row][col],(arr[row][col]-max+1)); 

     } 
     else if(col == max){ 

      g.addEdge(arr[row][col],(arr[row][col]-1)); 
      g.addEdge(arr[row][col],(arr[row][col]-max)); 
      g.addEdge(arr[row][col],(arr[row][col]+max)); 
      g.addEdge(arr[row][col],(arr[row][col]-max-1)); 
      g.addEdge(arr[row][col],(arr[row][col]+max-1)); 

     } 
     else if(col == 1){ 
      g.addEdge(arr[row][col],(arr[row][col]+1)); 
      g.addEdge(arr[row][col],(arr[row][col]+max)); 
      g.addEdge(arr[row][col],(arr[row][col]-max)); 
      g.addEdge(arr[row][col],(arr[row][col]-max+1)); 
      g.addEdge(arr[row][col],(arr[row][col]+max+1)); 

     } 
     else if(row == 1){ 
      g.addEdge(arr[row][col],(arr[row][col]-1)); 
      g.addEdge(arr[row][col],(arr[row][col]+1)); 
      g.addEdge(arr[row][col],(arr[row][col]+max)); 
      g.addEdge(arr[row][col],(arr[row][col]+max-1)); 
      g.addEdge(arr[row][col],(arr[row][col]+max+1)); 

     } 
     else{ 

      g.addEdge(arr[row][col],(arr[row][col]+1)); 
      g.addEdge(arr[row][col],(arr[row][col]-1)); 
      g.addEdge(arr[row][col],(arr[row][col]+max)); 
      g.addEdge(arr[row][col],(arr[row][col]-max)); 
      g.addEdge(arr[row][col],(arr[row][col]-max-1)); 
      g.addEdge(arr[row][col],(arr[row][col]-max+1)); 
      g.addEdge(arr[row][col],(arr[row][col]+max-1)); 
      g.addEdge(arr[row][col],(arr[row][col]+max+1)); 
     } 
    } 
} 

Примечание: Я хотел, чтобы мои вершины графа начать с 1, но не в 0. Это почему моя матрица имеет в ней дополнительную строку и столбец. Кроме того, мой график требует добавления края в обоих направлениях, поэтому он будет равен 1 ---> 0 и 0 ---> 1.

Спасибо!

ответ

0

Похоже, что ваш конструктор только выделяет N списки смежности, но затем определить N × N узлов. Вы вызываете addEdge() с каждым из этих узлов в качестве своего первого аргумента, который, когда вы попадаете на узел N +1, пытается записать за конец adj и вызывает переполнение буфера.

Чтобы поймать этот вид ошибки в будущем, вы можете определить adj как std::vector, который поставляется с проверкой границ. Это сделает все возможное для добавления узлов для вас, а также устранит утечку памяти, вызванную отсутствием деструктора, который удаляет arr. Если по какой-то причине вы не можете использовать std::vector или std::array, моим советом будет, по крайней мере, проверка вручную с помощью строки, такой как assert(v < V); в Graph::addEdge().

 Смежные вопросы

  • Нет связанных вопросов^_^