Cod sursa(job #2157253)

Utilizator CozmaCatalinCozma Catalin CozmaCatalin Data 9 martie 2018 13:55:50
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define Nmax 1005
#define INF 1000000000
#define pb push_back
using namespace std;
ifstream si("salvare.in");
ofstream so("salvare.out");
vector <int> g[Nmax],ans,v;
int n,k,d[Nmax];
bool viz[Nmax];
void dfs(int nod,int tata,int dis)
{
    int neg=INF,poz=-1;
    for(auto it:g[nod])
        if(it!=tata)
        {
            dfs(it,nod,dis);
            if(d[it]<0)
                neg=min(neg,d[it]);
            else
                poz=max(poz,d[it]);
        }
    if(poz==-1)
    {
        if(neg==INF)
            d[nod]=0;
        else
            d[nod]=neg+1;
    }
    else
    {
        if(poz+1<=-neg-2)
            d[nod]=neg+1;
        else
            d[nod]=poz+1;
    }

    if(d[nod]==dis||(!tata&&d[nod]>=0))
    {
        v.pb(nod);
        d[nod]=-(dis+1);
    }
}
int main()
{
    si>>n>>k;
    for(int i=1;i<n;++i)
    {
        int x,y;
        si>>x>>y;
        g[x].pb(y);
        g[y].pb(x);
    }
    int st=0,dr=n-1,mij,sol;
    while(st<=dr)
    {
        mij=((st+dr)>>1);
        v.clear();
        dfs(1,0,mij);
        if(v.size()<=k)
        {
            sol=mij;
            ans=v;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    so<<sol<<"\n";
    for(auto it:ans)
        viz[it]=1;
    for(int i=1;i<=n&&ans.size()<k;++i)
        if(!viz[i])
            ans.pb(i);
    sort(ans.begin(),ans.end());
    for(auto it:ans)
        so<<it<<" ";
    so<<"\n";
    return 0;
}