Pagini recente » Cod sursa (job #464042) | Cod sursa (job #1617789) | Cod sursa (job #1204853) | Cod sursa (job #83009) | Cod sursa (job #1644206)
#include <fstream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
ifstream fin("salvare.in");
ofstream fout("salvare.out");
const int dim = 1005;
const int inf = 1000000000;
int n, k;
vector<int> tree[dim], sol, vec;
bool selected[dim];
int checkDist, selectCount;
int dp[dim];
void dfs(int node, int parent) {
int minim = inf;
for (vector<int>::iterator adj = tree[node].begin(); adj != tree[node].end(); ++adj) {
if (*adj == parent)
continue;
dfs(*adj, node);
dp[node] = max(dp[node], dp[*adj] + 1);
minim = min(minim, dp[*adj] + 1);
}
if (dp[node] == checkDist) {
++selectCount;
vec.push_back(node);
dp[node] = -checkDist - 1;
return;
}
if (minim < 0 && -minim - 1 >= dp[node])
dp[node] = minim;
}
bool verif(int dist) {
checkDist = dist, selectCount = 0;
vec.clear();
memset(dp, 0, sizeof dp);
dfs(1, 0);
if (dp[1] >= 0) {
++selectCount;
vec.push_back(1);
}
return (selectCount <= k);
}
int main() {
fin >> n >> k;
for (int i = 1; i < n; ++i) {
int x, y;
fin >> x >> y;
tree[x].push_back(y);
tree[y].push_back(x);
}
int left = 0, right = n, ans = 0;
while (left <= right) {
int mid = (left + right) / 2;
if (verif(mid)) {
ans = mid;
sol = vec;
right = mid - 1;
}
else
left = mid + 1;
}
fout << ans << '\n';
sort(sol.begin(), sol.end());
for (unsigned int i = 0; i < sol.size(); ++i)
selected[sol[i]] = true;
k -= sol.size();
for (int i = 1; i <= n; ++i) {
if (selected[i]) {
fout << i << ' ';
continue;
}
if (k > 0) {
--k;
fout << i << ' ';
}
}
fout << '\n';
return 0;
}
//Trust me, I'm the Doctor!