Pagini recente » Cod sursa (job #724280) | Cod sursa (job #1941328) | Cod sursa (job #2921030) | Cod sursa (job #2966788) | Cod sursa (job #2390465)
#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;
}