Pagini recente » Cod sursa (job #1545029) | Cod sursa (job #1852029) | Cod sursa (job #656838) | Cod sursa (job #528747) | Cod sursa (job #2841599)
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
ifstream fin("salvare.in");
ofstream fout("salvare.out");
const int kN = 1e3;
vector<int> g[1 + kN];
int N, depth[1 + kN], sol[1 + kN];
bitset<1 + kN> mark;
void maxSelf(int &x, int y) {
if (x < y) {
x = y;
}
}
void minSelf(int &x, int y) {
if (y < x) {
x = y;
}
}
void dfs(int u, int par, int radius) {
int mx = 0, mn = INF;
for (int v : g[u]) {
if (v != par) {
dfs(v, u, radius);
maxSelf(mx, depth[v] + 1);
minSelf(mn, depth[v] + 1);
}
}
depth[u] = mx;
if (depth[u] == radius) {
sol[++N] = u;
depth[u] = -radius - 1;
} else if (mn < 0 && depth[u] < -mn) {
depth[u] = mn;
}
}
bool check(int m, int k) {
N = 0;
dfs(1, 0, m);
if (depth[1] > 0) {
sol[++N] = 1;
}
return N <= k;
}
void testCase() {
int n, k;
fin >> n >> k;
for (int i = 1; i < n; ++i) {
int u, v;
fin >> u >> v;
g[u].emplace_back(v);
g[v].emplace_back(u);
}
if (n == k) {
fout << "0\n";
for (int i = 1; i <= n; ++i) {
fout << i << ' ';
}
fout << '\n';
return;
}
int step = 1;
while (step * 2 <= n - 1) {
step *= 2;
}
int ans = 0;
while (step) {
if (!check(ans | step, k)) {
ans |= step;
}
step /= 2;
}
ans += 1;
check(ans, k);
fout << ans << '\n';
for (int i = 1; i <= N; ++i) {
mark[sol[i]] = true;
}
for (int v = 1; v <= n && N < k; ++v) {
if (!mark[v]) {
sol[++N] = v;
}
}
sort(sol + 1, sol + N + 1);
for (int i = 1; i <= k; ++i) {
fout << sol[i] << ' ';
}
fout << '\n';
}
int main() {
int tests = 1;
for (int tc = 1; tc <= tests; ++tc) {
testCase();
}
fin.close();
fout.close();
return 0;
}