2016-01-31 72 views
0

我寫了下面的C++程序來實現廣度優先搜索來解決this找到所有源節點的最短路徑的問題。布爾數組得到意想不到的默認值

#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

雖然有些編譯器接受它們作爲擴展名,但可變長度數組(如''visited')是無效的C++。 –

回答

3

我聲明布爾陣列中的每一次迭代和爲它的元素的默認值爲0。

不,它不是0有用於C++簡單類型沒有缺省值。我敢打賭,你可以隨意獲得一些隨機值,因爲你的數組不會自動初始化。

+0

謝謝,因爲在第一次迭代中元素的值爲零,是默認值。 –

1

您沒有初始化數組,並且本地數組未初始化爲零,因此需要顯式初始化。