fbpx

Problema #3110 – genius – Rezolvari PBInfo

de Mihai-Alexandru

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;
}
Comentarii

S-ar putea sa iti placa