Cod sursa(job #2390463)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 28 martie 2019 09:10:29
Problema Salvare Scor 65
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <bitset>
using namespace std;

ifstream fin("salvare.in");
ofstream fout("salvare.out");

int n,k,i,j,m,v[1001],cnt,st,dr,d;
vector <int> l[1001];
bitset <1001> f;

void dfs(int nod){
    f[nod]=1;
    int x=l[nod].size(),vecin;
    bool y=0;

    v[nod]=d*3;

    for(int i=0;i<x;i++){
        vecin=l[nod][i];
        if(!f[vecin]){
            dfs(vecin);
            v[nod]=min(v[nod],v[vecin]-1);
            y=1;
        }
    }

    if(!y)
        v[nod]=d;

    if(v[nod]==0){
        cnt++;
        v[nod]=2*d+1;
    }
}

int main(){
    fin>>n>>k;
    for(m=1;m<n;m++){
        fin>>i>>j;
        l[i].push_back(j);
        l[j].push_back(i);
    }

    if(k>=n){
        fout<<0<<"\n";
        for(i=1;i<=n;i++)
            fout<<i<<" ";

        return 0;
    }

    st=1; dr=n;
    while(st<=dr){
        d=(st+dr)/2;
        cnt=0;
        dfs(1);
        ///cout<<d<<" "<<cnt<<"\n";

        if(cnt<=k)
            dr=d-1;
        else
            st=d+1;

        f.reset();
        for(i=1;i<=n;i++)
            v[i]=0;
    }

    fout<<st<<"\n";
    cnt=0;
    d=st;
    dfs(1);

    for(i=1;i<=n && cnt<k;i++)
        if(v[i]!=2*st+1){
            v[i]=2*st+1;
            cnt++;
        }

    for(i=1;i<=n;i++){
        ///cout<<v[i]<<" ";
        if(v[i]==2*st+1)
            fout<<i<<" ";
    }

    return 0;
}