Cod sursa(job #1889441)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 22 februarie 2017 18:42:21
Problema Salvare Scor 5
Compilator cpp Status done
Runda becreative21 Marime 2 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>
#define Nmax 1001
using namespace std;

ifstream f("salvare.in");
ofstream g("salvare.out");

int n,k,X[Nmax],nr,dist[Nmax],nrv[Nmax];
bool uz[Nmax],placed[Nmax];
vector<int> V[Nmax];
vector<pair<int,int> > C;

bool weCan(int x)
{
    C.clear();
    memset(uz,0,sizeof(uz));
    for (int i=1;i<=n;i++)
    {
        nrv[i] = V[i].size();
        if(V[i].size()==1)
        {
            C.push_back(make_pair(i,0));
            uz[i] = 1;
        }
    }
    nr = 0;
    for (int i=0;i<C.size();i++)
    {
        int ok = 0;
        if (C[i].second == x)
        {
            nr++;
            X[nr] = C[i].first;
            C[i].second = -x;
            if(nr>k)
                return 0;
        }
        for (int j=0;j<V[C[i].first].size();j++)
        {
            int now = V[C[i].first][j];
            if (!uz[now])
            {
                ok = 1;
                nrv[now]--;
                dist[now] = max(dist[now],C[i].second+1);
                if (nrv[now]==1)
                {
                    uz[now] = 1;
                    C.push_back(make_pair(now,dist[now]));
                }
            }
        }
    }
    return 1;
}

int main()
{
    f>>n>>k;
    for (int i=1;i<n;i++)
    {
        int x,y;
        f>>x>>y;
        V[x].push_back(y);
        V[y].push_back(x);
    }

    int st=0,dr=n;

    while (st<=dr)
    {
        int mij = (st+dr)/2;
        if (weCan(mij))
            dr=mij-1;
        else
            st=mij+1;
    }

    if (st==0 && k!=n)
        st++;
    g<<st<<'\n';

    weCan(st);
    if (nr<k)
    {
        memset(uz,0,sizeof(uz));
        for (int i=1;i<=nr;i++)
            uz[X[i]] = 1;
        for (int i=C.size()-1;i>=0 && nr<k;i--)
            if (uz[C[i].first]==0)
                X[++nr] = C[i].first;
    }
    sort(X+1,X+nr+1);
    for (int i=1;i<=nr;i++)
        g<<X[i]<<' ';

    return 0;
}