Pagini recente » Cod sursa (job #1243634) | Cod sursa (job #1870012) | Cod sursa (job #1967567) | Cod sursa (job #2031294) | Cod sursa (job #2543952)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
const int NMAX = 1e3 + 5;
ifstream cin("salvare.in");
ofstream cout("salvare.out");
vector <int> g[NMAX];
int dp[NMAX];
vector <int> salv;
vector <int> sol;
bool f[NMAX];
void dfs(int node, int father, int d)
{
for(auto x: g[node]) {
if(x != father) {
dfs(x, node, d);
dp[node] = max(dp[node], dp[x] + 1);
}
}
if(dp[node] >= d) {
dp[node] = -d;
salv.push_back(node);
return;
}
}
bool Check(int d, int n, int k)
{
for(int i = 1; i <= n; ++i) {
dp[i] = 0;
}
salv.clear();
dfs(1, -1, d);
if(salv.size() <= k) {
return 1;
} else {
return 0;
}
}
void CopySalv()
{
sol.clear();
for(int i = 0; i < salv.size(); ++i)
sol.push_back(salv[i]);
}
int main() {
int n, k;
cin >> n >> k;
for(int i = 1; i < n; ++i) {
int x, y;
cin >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
}
int st = 0;
int dr = n;
int last = 0;
while(st <= dr) {
int med = (st + dr) / 2;
if(Check(med, n, k)) {
dr = med - 1;
last = med;
CopySalv();
} else {
st = med + 1;
}
}
cout << last << "\n";
for(auto x: sol) {
f[x] = 1;
}
k -= sol.size();
for(int i = 1; i <= n; ++i) {
if(k > 0 && f[i] == 0) {
k--;
sol.push_back(i);
if(k == 0)
break;
}
}
sort(sol.begin(), sol.end());
for(auto x: sol) {
cout << x << " ";
}
cout << "\n";
return 0;
}