Pagini recente » Cod sursa (job #1680951) | Cod sursa (job #244418) | Cod sursa (job #361266) | Cod sursa (job #1565364) | Cod sursa (job #1473500)
#include <bits/stdc++.h>
using namespace std;
const int Nmax = 1010;
int n , K , i , ret , nr;
int dist[Nmax] , ramas[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] = Nmax; ramas[node] = k;
for (auto &it : g[node])
if (it != prev)
dist[node] = min(dist[node] , dist[it] + 1),
ramas[node] = min(ramas[node] , ramas[it] - 1);
if (dist[node] <= ramas[node])
ramas[node] = Nmax;
if (!ramas[node])
dist[node] = 0, ramas[node] = Nmax, 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;
}