Cod sursa(job #2605911)

Utilizator AnnaLipianuLipianu Ana AnnaLipianu Data 26 aprilie 2020 12:24:50
Problema Salvare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
#include <vector>
#define DIM 1010
using namespace std;

ifstream fin ("salvare.in");
ofstream fout ("salvare.out");
int d[DIM],sol[DIM],f[DIM];
int n,k,i,st,dr,mid,el,val,mini,x,y;
vector <int> L[DIM];
void dfs (int nod, int tata, int val){
    int mini = 2000000000;
    for (int i=0;i<L[nod].size();i++){
        int vecin = L[nod][i];
        if (vecin!=tata){
            dfs (vecin,nod,val);
            d[nod] = max (d[nod],d[vecin]+1);
            mini = min (mini,d[vecin]+1);
        }
    }
    if (d[nod] == val){
        sol[nod] = 1, el++;
        d[nod] = -val-1;
        return;
    }
    if (mini < 0 && -mini >= d[nod]+1) d[nod] = mini;
}
int verif (int val){
    for (int i=1;i<=n;i++)
        d[i] = sol[i] = f[i] = 0;
    mini = 2000000000;
    el = 0;
    dfs (1,0,val);
    if (d[1] >= 0)
        sol[1] = 1,el++;
    return el;
}
int main (){

    fin>>n>>k;
    for (i=1;i<n;i++){
        fin>>x>>y;
        L[x].push_back (y);
        L[y].push_back (x);
    }
    st = 1, dr = n;
    while (st <= dr){
        mid = (st+dr)/2;
        if (verif(mid) <= k)
            dr = mid-1;
        else st = mid+1;
    }


    int x = verif (st);

    fout<<st<<"\n";
    for (i=1;i<=n;i++){
        if (el >= k)
            break;
        if (!sol[i])
            sol[i] = 1, el++;
    }

    for (i=1;i<=n;i++)
        if (sol[i]) fout<<i<<" ";

    return 0;
}