Cod sursa(job #2593378)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 3 aprilie 2020 18:45:48
Problema Salvare Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;

ifstream f ( "salvare.in" );
ofstream g ( "salvare.out" );

const int N = 1001;
vector < int > graph[N];
bool viz[N];
int d[N], Min[N], nr, k, v[N], ans[N], n;

int mod ( int x ){
    if ( x < 0 )
        x = - x;
    return x;
}

void dfs ( int node, int x ){
    viz[node] = 1;
    for ( int i = 0; i < graph[node].size ( ); i++ ){
        int new_node = graph[node][i];
        if ( viz[new_node] == 0 ){
            dfs ( new_node, x );
            d[node] = max ( d[node], d[new_node] + 1 );
            Min[node] = min ( Min[node], min ( Min[new_node], d[new_node] ) + 1 );
        }
    }
    if ( d[node] == x ){
        d[node] = - x - 1;
        v[++nr] = node;
    }
    else if ( mod ( Min[node] ) > d[node] )
        d[node] = Min[node];
}

bool verif ( int x ){
    for ( int i = 1; i <= n; i++ ){
        viz[i] = d[i] = Min[i] = 0;
    }
    dfs ( 1, x );
    if ( d[1] > 0 )
        v[++nr] = 1;
    if ( nr > k )
        return 0;
    return 1;
}

int main()
{   int x, y, i, st, dr, sol;
    f >> n >> k;
    for ( i = 1; i < n; i++ ){
        f >> x >> y;
        graph[x].push_back ( y );
        graph[y].push_back ( x );
    }
    st = 1, dr = n;
    while ( st <= dr ){
        int mid = ( st + dr ) >> 1;
        for ( i = 1; i <= nr; i++ )
            v[i] = 0;
        nr = 0;
        if ( verif ( mid ) == 1 ){
            if ( nr == k ){
                sol = mid;
                for ( i = 1; i <= nr; i++ )
                    ans[i] = v[i];
            }
            dr = mid - 1;
        }
        else
            st = mid + 1;
    }
    sort ( ans + 1, ans + k + 1 );
    g << sol << '\n';
    for ( i = 1; i <= k; i++ )
        g << ans[i] << ' ';
    return 0;
}