Pagini recente » Cod sursa (job #957791) | Cod sursa (job #1957941) | Cod sursa (job #1320346) | Cod sursa (job #1570095) | Cod sursa (job #1563148)
#include <algorithm>
#include <cstring>
#include <fstream>
#include <vector>
using namespace std;
const int N_MAX = 1000;
ifstream fin("salvare.in");
ofstream fout("salvare.out");
int N, K, M;
vector<int> G[N_MAX + 5];
int father[N_MAX + 5];
int level[N_MAX + 5];
vector<int> nodes;
bool in_sol[N_MAX + 5];
bool ok[N_MAX + 5];
void DfsBuild(int node) {
for (int son : G[node])
if (son != father[node]) {
father[son] = node;
level[son] = level[node] + 1;
DfsBuild(son);
}
}
void DfsFill(int node, int father, int d) {
ok[node] = true;
if (d > 0)
for (int son : G[node])
if (son != father)
DfsFill(son, node, d - 1);
}
int Count(int D) {
memset(in_sol, 0, sizeof in_sol);
memset(ok, 0, sizeof ok);
int cnt = 0;
for (int node : nodes)
if (!ok[node]) {
for (int i = 0; i < D && father[node]; ++i)
node = father[node];
in_sol[node] = true;
++cnt;
DfsFill(node, 0, D);
}
return cnt;
}
int Search() {
int l = 0, r = N - 1;
while (l <= r) {
int m = (l + r) / 2;
if (Count(m) > K)
l = m + 1;
else
r = m - 1;
}
return l;
}
int main() {
fin >> N >> K;
for (int i = 1; i < N; ++i) {
int x, y;
fin >> x >> y;
G[x].push_back(y);
G[y].push_back(x);
}
DfsBuild(1);
for (int i = 1; i <= N; ++i)
nodes.push_back(i);
sort(nodes.begin(), nodes.end(), [](int lhs, int rhs) { return level[lhs] > level[rhs]; });
M = Search();
fout << M << "\n";
K -= Count(M);
for (int i = 1; i <= N; ++i)
if (in_sol[i] || K-- > 0)
fout << i << " ";
fout << "\n";
return 0;
}