Submission #1347420

#TimeUsernameProblemLanguageResultExecution timeMemory
1347420SSKMFNetwork (BOI15_net)C++20
100 / 100
424 ms47188 KiB
#include <bits/stdc++.h>
using namespace std;

vector <int> adiacenta[500001];
int cantitate[500001] , ordine[500001];

int Calcul (const int nod , const int sursa)
{
    cantitate[nod] = (adiacenta[nod].size() == 1 ? 1 : 0);
    for (auto& vecin : adiacenta[nod]) {
        if (vecin != sursa)
            { cantitate[nod] += Calcul(vecin , nod); }
    }

    return cantitate[nod];
}

void Parcurgere (const int nod , const int sursa)
{
    if (adiacenta[nod].size() == 1)
        { ordine[++ordine[0]] = nod; }

    for (auto& vecin : adiacenta[nod]) {
        if (vecin != sursa)
            { Parcurgere(vecin , nod); }
    }
}

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

    int numar_noduri;
    cin >> numar_noduri;

    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]);
    }

    Calcul(1 , 0);

    int radacina = 1;
    while (true)
    {
        bool gasit = false;
        for (auto& vecin : adiacenta[radacina]) {
            if (cantitate[vecin] > cantitate[radacina] / 2)
            {
                gasit = true;
                cantitate[radacina] -= cantitate[vecin];
                cantitate[vecin] += cantitate[radacina];
                radacina = vecin;
                break;
            }
        }

        if (!gasit)
            { break; }
    }

    Parcurgere(radacina , 0);

    cout << (ordine[0] + 1) / 2 << '\n';

    for (int indice = 1 ; indice <= (ordine[0] + 1) / 2 ; indice++)
        { cout << ordine[indice] << ' ' << ordine[indice + ordine[0] / 2] << '\n'; }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...