Rezolvare completă PbInfo #1601 Ascensiune

Cerința

Înainte de a participa la Olimpiada Naționala de Informatică, Zoli s-a decis să se plimbe prin oraș. Orașul în care locuiește Zoli are forma unui arbore, fiecare nod reprezentând o locuință iar deplasarea între acestea se efectuează prin intermediul muchiilor.

Zoli dorește să determine lungimea maximă dintre oricare două locuințe din orașul său.

Date de intrare

Fișierul de intrare ascensiune.in conține pe prima linie numărul n, numărul de locuințe, iar pe următoarele n-1 linii câte două numere naturale a, b separate prin spații, reprezentând posibilitatea de deplasare bidirecțională între două locuințe.

Date de ieșire

Fișierul de ieșire ascensiune.out va conține pe prima linie un număr natural, reprezentând lungimea dintre cele mai îndepărtate locuințe din oraș.

Restricții și precizări

  • 1 ≤ n ≤ 100000
  • Pentru 40% dintre teste, 1 ≤ n ≤ 1000
  • Distanța dintre două locuințe reprezintă numărul minim de locuințe intermediare prin care se poate ajunge de la una la cealaltă, inclusiv locuințele inițiale.

Exemplu

ascensiune.in

8
1 2
1 3
2 4
2 5
3 6
3 7
5 8

ascensiune.out

6

Explicație

Cele mai îndepărtate două locuințe sunt cele cu numărul de ordine 8, respectiv 6 sau 7. Distanța dintre acestea este de 6 locuințe.

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 Ascensiune:

#include <fstream>
#include <vector>
using namespace std;

ifstream is("ascensiune.in");
ofstream os("ascensiune.out");

#define MaxN 100001

int n, nod_max, dmax;

vector<int> G[MaxN];

int dist[MaxN];
bool viz[MaxN];

void Dfs(int);

int main()
{
    is >> n;

    for (int i = 1, x, y; i < n; ++i)
    {
        is >> x >> y;
        G[x].push_back(y);
        G[y].push_back(x);
    }

    dist[1] = 1;

    Dfs(1);

    for (int i = 1; i <= n; ++i )
    {
        dist[i] = 0;
        viz[i] = false;
    }

    dist[nod_max] = 1;
    dmax = 0;

    Dfs(nod_max);

    os << dmax;

    is.close();
    os.close();
    return 0;
}

void Dfs(int i)
{
    viz[i] = true;
    for (const auto& p : G[i])
        if ( !viz[p] )
        {
            dist[p] = dist[i] + 1;
            if (dist[p] > dmax)
            {
                dmax = dist[p];
                nod_max = p;
            }
            Dfs(p);
        }

}

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 #1601 Ascensiune

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1601 Ascensiune 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!