Submission #96093

#TimeUsernameProblemLanguageResultExecution timeMemory
96093andrei110901Network (BOI15_net)C++14
100 / 100
1046 ms92636 KiB
#include <bits/stdc++.h>

using namespace std;

vector <vector <int>> ad, gramezi;
vector <int> sub;
int nrf, cf;

void dfs(int nod, int par){
    if(ad[nod].size() == 1)
        sub[nod] = 1;
    for(auto fiu : ad[nod])
        if(fiu != par){
            dfs(fiu, nod);
            sub[nod] += sub[fiu];
        }
}

int get_centroid(int nod, int par){
    for(auto fiu : ad[nod])
        if(fiu != par && sub[fiu] > nrf / 2)
            return get_centroid(fiu, nod);
    return nod;
}

struct cmp{
    bool operator()(const int &lhs, const int &rhs){
        if(gramezi[lhs].size() == gramezi[rhs].size())
            return lhs < rhs;
        return gramezi[lhs].size() > gramezi[rhs].size();
    }
};


void Frunza(int nod, int par, vector <int> &v){
    if(ad[nod].size() == 1){
        v.push_back(nod);
        return;
    }
    for(auto fiu : ad[nod])
        if(fiu != par)
            Frunza(fiu, nod, v);
}

int main()
{
    int n, x, y;
    //ios::sync_with_stdio(false);
    cin >> n;
    nrf = n;
    ad.resize(n + 1);
    sub.resize(n + 1);
    for(int i = 1; i < n; i++){
        cin >> x >> y;
        ad[x].push_back(y);
        ad[y].push_back(x);
    }
    dfs(1, 0);
    nrf = sub[1];
    cf = get_centroid(1, 0);
    set <int, cmp> q;
    for(auto fiu : ad[cf]){
        vector <int> v;
        Frunza(fiu, cf, v);
        gramezi.push_back(v);
    }
    for(int i = 0; i < gramezi.size(); i++)
        q.insert(i);
    cout << (nrf + 1) / 2 << '\n';
    if(nrf % 2 == 1){
        int aux = *q.begin();
        q.erase(q.begin());
        cout << cf << ' ' << gramezi[aux].back() << '\n';
        gramezi[aux].pop_back();
        q.insert(aux);
    }
    while(gramezi[*(q.begin())].size() > 0){
        int i1 = *(q.begin());
        q.erase(q.begin());
        int i2 = *(q.begin());
        q.erase(q.begin());
        cout << gramezi[i1].back() << ' ' << gramezi[i2].back() << '\n';
        gramezi[i1].pop_back();
        gramezi[i2].pop_back();
        q.insert(i1);
        q.insert(i2);
    }
    return 0;
}

Compilation message (stderr)

net.cpp: In function 'int main()':
net.cpp:67:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < gramezi.size(); i++)
                    ~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...