Submission #923565

#TimeUsernameProblemLanguageResultExecution timeMemory
923565andrei_iorgulescuNetwork (BOI15_net)C++14
100 / 100
666 ms120444 KiB
#include <bits/stdc++.h>
 
using namespace std;
 
int n;
int deg[500005];
vector<int>g[500005];
int nrf[500005],heavyson[500005],mxf[500005];
int frunze;
vector<int>l[500005],f[500005];
 
void dfs(int nod,int tata)
{
    if (deg[nod] == 1)
        nrf[nod] = 1;
    else
    {
        for (auto vecin : g[nod])
        {
            if (vecin != tata)
            {
                dfs(vecin,nod);
                nrf[nod] += nrf[vecin];
                if (nrf[vecin] > mxf[nod])
                {
                    mxf[nod] = nrf[vecin];
                    heavyson[nod] = vecin;
                }
            }
        }
    }
}
 
int findroot(int nod)
{
    if (mxf[nod] <= frunze / 2 + frunze % 2)
        return nod;
    else
        return findroot(heavyson[nod]);
}
 
vector<pair<int,int>>sol;
 
void dfs2(int nod,int tata)
{
    for (auto vecin : g[nod])
    {
        if (vecin != tata)
        {
            f[nod].push_back(vecin);
            dfs2(vecin,nod);
        }
    }
}
 
int cine;
 
void dfs3(int nod)
{
    if (deg[nod] == 1)
        l[cine].push_back(nod);
    else
    {
        for (auto fiu : f[nod])
            dfs3(fiu);
    }
}
 
void getleaves(int nod)
{
    cine = nod;
    dfs3(nod);
}
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> n;
    for (int i = 1; i < n; i++)
    {
        int x,y;
        cin >> x >> y;
        deg[x]++;
        deg[y]++;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    for (int i = 1; i <= n; i++)
        if (deg[i] == 1)
            frunze++;
    int r;
    for (int i = 1; i <= n; i++)
        if (deg[i] > 1)
            r = i;
    dfs(r,0);
    r = findroot(r);
    dfs2(r,0);
    for (auto fiu : g[r])
        getleaves(fiu);
    priority_queue<pair<int,int>>pq;
    for (auto fiu : g[r])
        pq.push({l[fiu].size(),fiu});
    while (!pq.empty())
    {
        int nod = pq.top().second;
        pq.pop();
        if (pq.empty())
        {
            sol.push_back({r,l[nod].back()});
            break;
        }
        int nod2 = pq.top().second;
        pq.pop();
        sol.push_back({l[nod].back(),l[nod2].back()});
        l[nod].pop_back();
        l[nod2].pop_back();
        if (l[nod].size() != 0)
            pq.push({l[nod].size(),nod});
        if (l[nod2].size() != 0)
            pq.push({l[nod2].size(),nod2});
    }
    cout << sol.size() << '\n';
    for (auto it : sol)
        cout << it.first << ' ' << it.second << '\n';
    return 0;
}

Compilation message (stderr)

net.cpp: In function 'int main()':
net.cpp:98:17: warning: 'r' may be used uninitialized in this function [-Wmaybe-uninitialized]
   98 |     r = findroot(r);
      |         ~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...