Cod sursa(job #2595619)

Utilizator dorupopDoru Pop dorupop Data 8 aprilie 2020 00:22:58
Problema Salvare Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
#include <cstdlib>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("salvare.in");
ofstream fout("salvare.out");
vector <int> g[1001],rez,sol;
int d[1001],viz[1001];
int n,k,st,dr,tmax,dist,x,y;
void dfs(int nod, int tata)
{
    int Min=2000000000;
    for(int i=0;i<g[nod].size();i++)
    {
        int nou=g[nod][i];
        if(nou!=tata)
        {
            dfs(nou,nod);
            d[nod]=max(d[nod],d[nou]+1);
            Min=min(Min,d[nou]+1);
        }
    }
    if(d[nod]==dist)
    {
        rez.push_back(nod);
        d[nod]=-dist-1;
    }
    if(Min<0&&-Min>d[nod])
        d[nod]=Min;
}
int main()
{
    fin>>n>>k;
    for(int i=1;i<n;i++)
    {
        fin>>x>>y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    st=1,dr=n;
    while(st<=dr)
    {
        int mid=(st+dr)/2;
        for(int i=1;i<=n;i++)
            d[i]=0;
        rez.clear();
        dist=mid;
        dfs(1,0);
        if(d[1]>0)
            rez.push_back(1);
        if(rez.size()<=k)
        {
            sol.clear();
            for(int i=0;i<rez.size();i++){
                sol.push_back(rez[i]);
                viz[rez[i]]=1;
            }
            if(rez.size()<k){

                for(int i=1;i<=n;i++){
                     if(viz[i]==0)
                        sol.push_back(rez[i]);
                     else
                        viz[i]=0;
                }
            }
            tmax=mid;
            dr=mid-1;
        }
        else
            st=mid+1;
    }
    fout<<tmax<<'\n';
    sort(sol.begin(),sol.end());
    for(int i=0;i<sol.size();i++)
        fout<<sol[i]<<' ';
    return 0;
}