Submission #1324619

#TimeUsernameProblemLanguageResultExecution timeMemory
1324619SSKMFTorrent (COI16_torrent)C++20
100 / 100
263 ms22300 KiB
#include <bits/stdc++.h>
using namespace std;

pair <int , int> interzis;
vector <int> adiacenta[300001];
int ordine[300001];

inline bool GetPath (const int nod , const int dorit , const int sursa)
{
    if (nod == dorit)
    {
        ordine[++ordine[0]] = nod;
        return true;
    }

    for (auto& vecin : adiacenta[nod]) {
        if (vecin != sursa) {
            if (GetPath(vecin , dorit , nod))
            {
                ordine[++ordine[0]] = nod;
                return true;
            }
        }
    }

    return false;
}

inline int Calcul (const int nod , const int sursa)
{
    vector <int> candidati;
    for (auto& vecin : adiacenta[nod]) {
        if (vecin != sursa && !((nod == interzis.first && vecin == interzis.second) || (nod == interzis.second && vecin == interzis.first)))
            { candidati.push_back(Calcul(vecin , nod) + 1); }
    }

    sort(candidati.begin() , candidati.end() , greater <int> ());

    int maxim = 0;
    for (int indice = 0 ; indice < (int)candidati.size() ; indice++)
        { maxim = max(maxim , candidati[indice] + indice); }

    return maxim;
}

int main ()
{
    ios :: sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    int numar_noduri , inceput[2];
    cin >> numar_noduri >> inceput[0] >> inceput[1];

    for (int indice = 1 ; indice < numar_noduri ; indice++)
    {
        int nod[2]; cin >> nod[0] >> nod[1];
        adiacenta[nod[0]].push_back(nod[1]);
        adiacenta[nod[1]].push_back(nod[0]);
    }

    GetPath(inceput[0] , inceput[1] , 0);

    int stanga = 1 , dreapta = ordine[0] - 1 , raspuns = INT32_MAX;
    while (stanga <= dreapta)
    {
        const int candidat = (stanga + dreapta) >> 1;
        interzis = {ordine[candidat] , ordine[candidat + 1]};
        const int necesar_1 = Calcul(inceput[1] , 0);
        const int necesar_2 = Calcul(inceput[0] , 0);
        raspuns = min(raspuns , max(necesar_1 , necesar_2));

        if (necesar_1 >= necesar_2)
            { dreapta = candidat - 1; }
        else
            { stanga = candidat + 1; }
    }
    
    cout << raspuns;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...