Cod sursa(job #2390465)

Utilizator robx12lnLinca Robert robx12ln Data 28 martie 2019 09:11:33
Problema Salvare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include<bits/stdc++.h>
using namespace std;

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

int N, K, V[1005], cnt, f[1005], Sol[1005];
vector<int> edge[1005];

void dfs( int nod, int fa, int Dst ){

    int minim = 0x3f3f3f3f;

    for( int v : edge[nod] ){
        if( v != fa ){
            dfs( v, nod, Dst );
            V[nod] = max( V[nod], V[v] + 1 );
            minim = min( minim, V[v] + 1 );
        }
    }

    if( V[nod] == Dst ){
        cnt++;
        Sol[nod] = 1;
        V[nod] = -Dst - 1;
        return;
    }

    if( minim < 0 && -minim -1 >= V[nod] )
        V[nod] = minim;
}

inline bool check( int D ){
    memset( V, 0, sizeof(V) );
    memset( Sol, 0, sizeof(Sol) );
    cnt = 0;

    dfs( 1, 0, D );

    if( V[1] >= 0 ){
        ++cnt;
        Sol[1] = 1;
    }

    if( cnt <= K )
        return true;
    return false;
}

int main(){

    fin >> N >> K;
    for( int i = 1; i < N; ++i ){
        int x, y; fin >> x >> y;
        edge[x].push_back( y );
        edge[y].push_back( x );
    }

    if( N <= K ){
        fout << "0\n";
        for( int i = 1; i <= N; i++ )
            fout << i << " ";
        return 0;
    }

    int st = 1, dr = N, mid;
    while( st <= dr ){
        mid = ( st + dr ) >> 1;
        if( check( mid ) == true )
            dr = mid - 1;
        else
            st = mid + 1;
    }

    bool ok = check( st );
    for( int i = 1; i <= N && cnt < K; ++i )
        if( Sol[i] == 0 )
            ++cnt, Sol[i] = 1;

    fout << st << "\n";
    for( int i = 1; i <= N; ++i )
        if( Sol[i] == 1 )
            fout << i << " ";
    return 0;
}