# PBinfo #1601 – Ascensiune – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

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 ≤ 100.000
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.

## Cod sursă C++

```cpp
#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);
        }
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1601)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1601/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1601/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
