#include <queue>
#include <vector>
#include <iostream>
using namespace std;
int main() {
int x;
cin >> x;
for(int tt=0;tt<x;tt++)
{
//cout << "HI" << endl;
int n, m;
cin >> n >> m;
vector< vector<int> > g(n);
for(long j =0; j< m;j++)
{
int u , v;
cin >> u >> v;
g[u-1].push_back(v-1);
g[v-1].push_back(u-1);
}
int s;
cin >> s;
vector<int> out(n,-1);
vector<int> visited(n,0);
int value = 0;
queue<int> q;
q.push(s-1);
q.push(-1);
visited[s-1] =1;
int flag =0;
while(!q.empty())
{
int v = q.front();
out[v] = value;
q.pop();
if(v == -1)
{
value += 6;
}
else{
for(vector<int>::iterator it = g[v].begin(); it != g[v].end();it++)
{
if(visited[*it] == 0)
{
q.push(*it);
visited[*it] =1;
}
}
}
}
//cout << "hello" << endl;
for(int k =0; k<n; k++)
{
if(k!= s-1)
{
cout << out[k] << " ";
}
}
cout << endl;
//cout << "yo";
}
//cout << "you";
return 0;
}
Этот код хорошо работает, если начальный узел имеет только соседний уровень 1-го уровня. Для того, чтобы заставить его работать во всех случаях, когда я изменитьC++ STL Breadth first search
if(v == -1)
{
value += 6;
}
в
if(v == -1)
{
value += 6;
if(!q.empty())
q.push(-1);
}
она даже не работает для всех testcases в настоящее время. Затем программа прерывается и сообщение об ошибке от хакера ранга * Ошибка в `решение": двойной бесплатно или повреждение (уходит): 0x00000000009e5cf0 *
Я не могу понять, почему это происходит. Почему существует проблема в цикле for, когда я обрабатываю очередь.
Ссылка на вопрос о хакерранке.
https://www.hackerrank.com/challenges/bfsshortreach
Вы выйдете за пределы одного из ваших векторов. Добавьте некоторую проверку границ, но, что еще более важно, добавьте ** проверку ввода **. –
Позволяет пропустить все детали nitty и посмотреть на наиболее подозрительную последовательность операторов: 'q.push (-1); int v = q.front(); out [v] = значение; '. – grek40
широта-первый поиск. Поместите корень в очередь. Пока очередь не пуста, возьмите первый член и добавьте непосредственных детей в обратную сторону очереди. Поэтому вам нужен std :: deque. –