Pagini recente » Cod sursa (job #129880) | Cod sursa (job #2760259) | Cod sursa (job #2282972) | Cod sursa (job #2759951) | Cod sursa (job #569098)
Cod sursa(job #569098)
#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], A[Nmax], B[Nmax], T[Nmax], Sol[Nmax], Ac[Nmax], OK[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) {
viz[nod] = 1;
OK[nod] = 0;
for (vector <int>::iterator it = V[nod].begin (); it != V[nod].end (); it++)
if (!viz[*it])
T[*it] = nod, dfs (*it);
A[nod] = INF;
vector <int>::iterator it;
int fiu = -1;
for (it = V[nod].begin (); it != V[nod].end (); it++)
if (*it != T[nod] && A[*it] != INF)
if (A[nod] > A[*it] + 1)
A[nod] = A[*it] + 1, fiu = *it;
B[nod] = 0;
for (it = V[nod].begin (); it != V[nod].end (); it++)
if (*it != T[nod] && *it != fiu)
if (!OK[*it]) B[nod] = max (B[nod], B[*it] + 1);
if (B[nod] == X || (nod == 1 && B[nod] + A[nod] > X)) {
K++; Ac[++Ac[0]] = nod;
OK[nod] = 1;
B[nod] = 0;
A[nod] = 0;
}
if (A[nod] != INF && B[nod] + A[nod] <= X)
B[nod] = 0, OK[nod] = 1;
}
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 = 1;
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;
}