Cod sursa(job #572012)
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
#define Nmax 1010
#define Kmax 510
#define INF (1 << 30)
int n, k, X, K;
int viz[Nmax], Tata[Nmax], A[Nmax], B[Nmax], Ac[Nmax], Sol[Nmax];
vector <int> V[Nmax];
void citire () {
int i, x, y;
scanf ("%d %d", &n, &k);
for (i = 1; i < n; i++) {
scanf ("%d %d", &x, &y);
V[x].push_back (y);
V[y].push_back (x);
}
}
void dfs (int nod) {
vector <int>::iterator it;
viz[nod] = 1;
for (it = V[nod].begin (); it != V[nod].end (); it++)
if (!viz[*it])
Tata[*it] = nod, dfs (*it);
A[nod] = INF;
for (it = V[nod].begin (); it != V[nod].end (); it++)
if (*it != Tata[nod] && A[nod] > A[*it] + 1 ) A[nod] = A[*it] + 1;
B[nod] = 0;
for (it = V[nod].begin (); it != V[nod].end (); it++)
if (*it != Tata[nod] && (B[*it] + 1 + A[nod] > X))
if (B[nod] < B[*it] + 1)
B[nod] = B[*it] + 1;
if (B[nod] + A[nod] <= X) {
B[nod] = 0;
}
if (B[nod] == X || (nod == 1 && B[nod] + A[nod] > X)) {
K++;
A[nod] = 0;
B[nod] = 0;
Ac[++Ac[0]] = nod;
}
}
int main () {
freopen ("salvare.in", "r", stdin);
freopen ("salvare.out", "w", stdout);
citire ();
int p = 1, u = n, mij, sol = 0;
while (p <= u) {
mij = (p + u) >> 1;
X = mij; K = 0; Ac[0] = 0; //X = 4;
memset (viz, 0, sizeof (viz));
dfs (1);
if (K <= k) {
sol = mij;
u = mij - 1;
memcpy (Sol, Ac, sizeof (Ac));
}
else
p = mij + 1;
}
printf ("%d\n", sol);
memset (viz, 0, sizeof (viz));
int i;
for (i = 1; i <= n; i++)
viz[ Sol[i] ] = 1;
for (i = 1; i <= n && Sol[0] != k; i++)
if (!viz[i]) Sol[++Sol[0]] = i;
for (i = 1; i <= k; i++)
printf ("%d ", Sol[i]);
return 0;
}