La grupa de excelență la care profesorul Genius predă sunt înscriși N
elevi (reprezentați prin numere distincte de la 1
la N
) care sunt sau nu prieteni. Pentru a face rezolvatul de probleme mai interesant, profesorul a inventat un joc: acesta alege elevul cu indicele K
și îi spune enunțul unei probleme la care să se gândească și pe care să o spună mai departe tuturor prietenilor săi. Fiecare elev care află problema o va transmite în ziua următoare prietenilor săi care nu au aflat-o încă și tot așa, până când problema nu mai poate fi transmisă mai departe. Jocul e însă mai complex de atât: în ziua în care un elev află problema nivelul său de aprofundare a problemei este 0
, în următoare zi nivelul de aprofundare este 1
și așa mai departe. În ziua X
după aflarea problemei, un elev va ajunge la gradul X
de aprofundare al acesteia. Profesorul Genius i-a anunțat pe elevi că aceștia se vor întâlni pentru a rezolva problema doar după ce toată lumea a aflat problema și toți elevii au ajuns la un nivel de aprofundare al problemei cel puțin P
.
Cerința
Știind modul în care funcționează jocul, profesorul Genius vrea să calculeze după câte zile de la lansarea problemei se va întâlni cu elevii săi pentru a o rezolva.
Date de intrare
Fișierul de intrare genius.in
conține următoarele informații:
Exemplu
genius.in
7 6 1 3 1 7 1 5 2 5 2 4 5 6 2 5
genius.out
8
Explicație
În ziua 0
elevul 2
află problema și are nivelul de aprofundare 0
În ziua 1
află problema elevii cu indicii 4
și 5
În ziua 2
află problema elevii cu indicii 1
și 6
În ziua 3
află problema elevii cu indicii 3
și 7
Au trecut 3
zile și pentru ca nivelul minim de aprofundare pentru oricare dintre elevi să fie 5
, trebuie să mai treacă încă 5
zile
#include <bits/stdc++.h> using namespace std; ifstream cin("genius.in"); ofstream cout("genius.out"); int n, m, k, p, P[50001]; vector< vector<int> > G(50001); void lee(int nod){ queue<int> Q; Q.push(nod); P[nod] = 1; while(!Q.empty()){ int x = Q.front(); for(auto i:G[x]) if(!P[i]) P[i] = P[x] + 1, Q.push(i); Q.pop(); } } int main(){ cin >> n >> m; int x, y; for(int i = 1; i <= m; ++i){ cin >> x >> y; G[x].push_back(y); G[y].push_back(x); } cin >> k >> p; lee(k); bool ok = true; int maxi = 0; for(int i = 1; i <= n; ++i){ maxi = max(maxi, P[i]); if(!P[i]) ok = false; } if(ok) cout << maxi + p - 1; else cout << -1; return 0; }