Mam takie zadanie:
Do klasy informatycznej uczęszcza n osób, z których każda posiada telefon komórkowy. Niektórzy wymienili się już swoimi numerami. Wychowawczyni zastanawia się, czy osoba x zdoła przekazać informację osobie y. Osoba x może dzwonić tylko do osób, które ma zapisane na liście kontaktów telefonu, jednak każdy kolega lub koleżanka, do którego lub której zadzwoni, może mu podać listę osób ze swojej listy kontaktów.
Wejście
Pierwszy wiersz wejścia zawiera dwie liczby całkowite n, m (1 <= n, m <=1 000 000) oznaczające, odpowiednio, liczbę osób i liczbę wymian numerów telefonu. W m kolejnych wierszach znajdują się po dwie liczby całkowite a, b (1 <= a, b <= n) oznaczające, że osoby a i b wymieniły się swoimi numerami telefonów. Kolejny wiersz zawiera liczbę całkowitą z (1 ¬ z ¬ 1 000 000) oznaczającą liczbę pytań nauczycielki. W z kolejnych wierszach są po dwie liczby całkowite x, y (1 <= x, y <= n) oznaczające pytanie: czy osoba x jest w stanie przekazać informację osobie y.
Wyjście
Wyjście powinno zawierać z wierszy będących odpowiedziami na kolejne pytania. W każdym wierszu powinno znaleźć się słowo TAK, jeśli osoba mogła przekazać informację, lub NIE, w przeciwnym przypadku.
No i mam takie rozwiązanie z użyciem bfs:
#include "bits/stdc++.h"
using namespace std;
bool bfs(int node, int key, vector<vector<int>> grafy){
vector<bool> odwiedzone(grafy.size(), false);
vector<int> kolejka;
kolejka.push_back(node);
odwiedzone[node] = true;
if (node == key)
return true;
for (int i = 0; i < kolejka.size(); i++){
for (int graf: grafy[kolejka[i]]){
if (odwiedzone[graf] == false){
if (graf == key)
return true;
kolejka.push_back(graf);
odwiedzone[graf] = true;
}
}
}
return false;
}
int main()
{
ios_base::sync_with_stdio(0);
int n, m, a, b, node, key, z;
cin >> n >> m;
vector<vector<int>> grafy(n+1);
for (int i = 0; i < m; i++){
cin >> a >> b;
grafy[a].push_back(b);
grafy[b].push_back(a);
}
cin >> z;
for (int i = 0; i < z; i++){
cin >> node >> key;
if (bfs(node, key, grafy))
cout << "TAK" << endl;
else
cout << "NIE" << endl;
}
return 0;
}
niestety przekraczam limit czasu(10 s) o 0.05, jak mógłbym zoptymalizować ten kod?
Tutaj testuje rozwiązania, Nazwa zadania to Lista kontaktow