Cod sursa(job #2455847)

Utilizator alexradu04Radu Alexandru alexradu04 Data 12 septembrie 2019 21:11:50
Problema Salvare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>
using namespace std;
vector <int> g[1005],ans,v;
int n,k,d[1005];
bool viz[1005];
void dfs(int nod,int tata,int dis)
{
    int neg=1e9,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==1e9)
            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.push_back(nod);
        d[nod]=-(dis+1);
    }
}
int main()
{
    freopen("salvare.in","r",stdin);
    freopen("salvare.out","w",stdout);
    scanf("%d %d",&n,&k);
    for(int i=1;i<n;++i)
    {
        int x,y;
        scanf("%d %d",&x,&y);
        g[x].push_back(y);
        g[y].push_back(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;
    }
    printf("%d\n",sol);
    for(auto it:ans)
        viz[it]=1;
    for(int i=1;i<=n&&ans.size()<k;++i)
        if(!viz[i])
            ans.push_back(i);
    sort(ans.begin(),ans.end());
    for(auto it:ans)
        printf("%d ",it);
    return 0;
}