Я написал следующую программу на 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. Может кто-нибудь, пожалуйста, объясните это.
Массивы переменной длины (например, ваши 'посещение') недействительны C++, хотя некоторые компиляторы принимают их как расширение .. –