Rezolvare completă PbInfo #3110 genius

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:

  • pe prima linie se află două numere: N, numărul de elevi înscriși la grupa de excelență, și M, numărul relațiilor de prietenie;
  • pe următoarele M linii se află câte două numere A și B, acestea reprezentând o relație de prietenie (bidirecțională) între elevii desemnați de cele două numere;
  • pe următoarea linie se află K, indicele elevului căruia profesorul îi spune prima dată problema;
  • pe următoarea linie se află P, nivelul minim de aprofundare al problemei de către toți elevii, necesar pentru ca elevii să se întâlnească pentru aflarea rezolvării.

Date de ieșire

În fișierul genius.out se va afișa un singur număr natural, reprezentând numărul minim de zile după care elevii se vor întâlni cu profesorul Genius pentru rezolvarea problemei sau -1 dacă întâlnirea nu este posibilă în condițiile impuse de joc.

Restricții și precizări

  • 2 ≤ N ≤ 50.000
  • 1 ≤ M ≤ 100.000
  • 1 ≤ A, B ≤ N
  • 1 ≤ K ≤ N
  • 1 ≤ P ≤ 10.000.000

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

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema genius:

#include <fstream>
#include <vector>

#define DIM 50010

using namespace std;

vector <int> L[DIM];
int d[DIM];
int c[DIM];
int f[DIM];

int n, m, k, p, maxim, x, y, cost;

void bfs(int start) {
    int p = 1, u = 1;
    f[k] = 1;
    c[1] = k;
    while(p <= u) {
        int nod = c[p];
        for (int i=0;i<L[nod].size();i++) {
            int vecin = L[nod][i];
            if (f[vecin] == 0) {
                f[vecin] = 1;
                c[++u] = vecin;
                d[vecin] = 1 + d[nod];
            }
        }
        p++;
    }
}


int main () {
    ifstream fin ("genius.in");
    ofstream fout("genius.out");

    fin>>n>>m;
    for (int i=1;i<=m;i++) {
        fin>>x>>y;
        L[x].push_back(y);
        L[y].push_back(x);
    }
    fin>>k;
    fin>>p;

    bfs(k);
    for (int i=1;i<=n;i++)
        if(f[i] == 0) {
            fout<<-1;
            return 0;
        }

    for (int i=1;i<=n;i++)
        if (d[i] > maxim)
            maxim = d[i];
    fout<<maxim + p;
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #3110 genius

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #3110 genius de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!