Pagini recente » Cod sursa (job #1777873) | Cod sursa (job #2601247) | Cod sursa (job #175213) | Cod sursa (job #2875014) | Cod sursa (job #2593380)
#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 = 0;
f >> n >> k;
for ( i = 1; i < n; i++ ){
f >> x >> y;
graph[x].push_back ( y );
graph[y].push_back ( x );
}
st = 0, 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 <= k; 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;
}