Cod sursa(job #2595977)

Utilizator dorupopDoru Pop dorupop Data 8 aprilie 2020 20:55:30
Problema Salvare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <climits>
using namespace std;
ifstream fin("salvare.in");
ofstream fout("salvare.out");
vector <int> g[1001];
int d[1001],rez[1001],sol[1001];
bool viz[1001];
int n,k,st,dr,tmax,dist,x,y,t;
void dfs(int nod, int tata)
{
    int Min=INT_MAX;
    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[++t]=nod;
        viz[nod]=1;
        d[nod]=-dist-1;
    }
    else
    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=0,dr=n;
    while(st<=dr)
    {
        for(int i=1;i<=n;i++)
            viz[i]=d[i]=0;
        t=0;
        int mid=(st+dr)/2;
        dist=mid;
        dfs(1,0);
        if(d[1]>0)
            rez[++t]=1,viz[1]=1;
        if(t<=k)
        {
            for(int i=1;i<=t;i++)
                sol[i]=rez[i];
            tmax=mid;
            dr=mid-1;
            for(int i=1;i<=n&&t<k;i++)
                if(viz[i]==0)
                    sol[++t]=i;
        }
        else
            st=mid+1;
    }
    fout<<tmax<<'\n';
    sort(sol+1,sol+k+1);
    for(int i=1;i<=k;i++)
        fout<<sol[i]<<' ';
    return 0;
}