Pagini recente » Cod sursa (job #1057463) | Cod sursa (job #455597) | Cod sursa (job #1600613) | Cod sursa (job #571942) | Cod sursa (job #1473471)
#include <bits/stdc++.h>
using namespace std;
const int Nmax = 1010;
int n , k , i , ret , nr;
int dist[Nmax];
bool marked[Nmax] , used[Nmax];
vector < int > ans , g[Nmax];
void dfs(int node , int prev , int k)
{
for (auto &it : g[node])
if (it != prev)
dfs(it , node , k);
dist[node] = (g[node].size() == 1) ? 1 : 0;
for (auto &it : g[node])
if (it != prev)
dist[node] = max(dist[node] , dist[it] + 1);
if (dist[node] == k + 1)
dist[node] = 0, marked[node] = 1;
}
bool check(int dist)
{
memset(marked , 0 , sizeof(marked));
dfs(1 , 0 , dist);
for (ret = 0, i = 1; i <= n; ++i)
if (marked[i]) ret++;
return (ret <= k);
}
int search_()
{
int i , j , step;
for (step = 1; step < n; step <<= 1);
for (i = n; step; step >>= 1)
if (i - step > 0 && check(i - step))
{
i -= step; nr = ret;
memcpy(used , marked, sizeof(marked));
}
for (j = 1; j <= n; ++j)
if (used[j]) ans.push_back(j);
else if (nr < k) ans.push_back(j), nr++;
return i;
}
int main()
{
freopen("salvare.in","r",stdin);
freopen("salvare.out","w",stdout);
scanf("%d %d", &n, &k);
for (i = 1; i < n; ++i)
{
int x , y;
scanf("%d %d", &x, &y);
g[x].push_back(y);
g[y].push_back(x);
}
printf("%d\n", search_());
for (auto &it : ans)
printf("%d ", it);
return 0;
}