2016-01-31 2 views
0

Я написал следующую программу на C++, чтобы реализовать первый поиск по ширине, чтобы решить проблему поиска кратчайшего пути для всех узлов из источника.Логический массив, получающий неожиданные значения по умолчанию

#include<iostream> 
#include<vector> 
#include<string.h> 
#include<queue> 

using namespace std; 

int main() 
{ 
    int test; 
    cin >> test; 
    while(test--) 
    { 
     int m,n,source; 
     cin >> n >> m; 
     bool visited[n+1]; 
     int dist[1001]; 
     queue<int> q; 
     memset(dist, -1, sizeof(dist)); 
     vector<int> adj[1001]; 
     for(int i = 0; i < m; i++) 
     { 
      int a, b; 
      cin >> a >> b; 
      adj[a].push_back(b); 
      adj[b].push_back(a); 
     } 
     cin >> source; 
     dist[source] = 0; 
     visited[source] = true; 
     q.push(source); 
     while(q.size()) 
     { 
      int v = q.front(); 
      q.pop(); 
      for(int i : adj[v]) 
      { 
       if(!visited[i]) 
       { 
        q.push(i); 
        dist[i] = dist[v] + 6; 
        visited[i] = true; 
       } 
      } 
     } 
     for(int i = 1; i <= n; i++) 
     { 
      if(i != source) 
      { 
       cout << dist[i] << " "; 
      } 
     } 
     cout << "\n"; 
    } 
} 

Это хорошо работает, если значение теста 1, но когда значение 2 или более, некоторые значения булева массива «посетили» стали 1 во втором и последующих итерациях. Я не понимаю, почему и как это происходит, когда я объявляю логический массив на каждой итерации, а значение по умолчанию для его элементов равно 0. Может кто-нибудь, пожалуйста, объясните это.

+1

Массивы переменной длины (например, ваши 'посещение') недействительны C++, хотя некоторые компиляторы принимают их как расширение .. –

ответ

3

Я объявляю булев массив в каждой итерации и значение по умолчанию для его элементов 0.

Нет, это не 0. Там нет значения по умолчанию для C++ простых типов. Моя ставка заключается в том, что вы можете получить некоторые случайные значения, так как ваш массив не инициализируется автоматически.

+0

Спасибо, так как значения элементов на первой итерации были равны нулю, я предположил, что это значение по умолчанию. –

1

Вы не инициализируете массив, а локальные массивы не инициализируются нолем, поэтому необходима явная инициализация.

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