Pagini recente » Cod sursa (job #2529133) | Cod sursa (job #2668772) | Cod sursa (job #519041) | Cod sursa (job #2805772) | Cod sursa (job #2390354)
#include <bits/stdc++.h>
#define DEF 1010
#define INF 1 << 29
using namespace std;
ifstream fin ("salvare.in");
ofstream fout ("salvare.out");
vector < int > L[DEF], Sol;
int n, m, k, maxDist, nr;
int Dist[DEF], Fr[DEF];
deque < int > Q;
bitset < DEF > Viz;
void dfs (int nod, int tata) {
int minim = INF;
for (auto it : L[nod]) {
if (it != tata) {
dfs (it, nod);
Dist[nod] = max (Dist[nod], Dist[it] + 1);
minim = min (minim, Dist[it] + 1);
}
}
if (Dist[nod] == maxDist) {
++ nr;
Sol.push_back (nod);
Dist[nod] = -maxDist - 1;
return;
}
if (minim < 0 and -minim - 1 >= Dist[nod]) {
Dist[nod] = minim;
}
}
bool verif (int d) {
maxDist = d, nr = 0;
Sol.clear ();
fill (Dist + 1, Dist + n + 1, 0);
dfs (1, 0);
if (Dist[1] >= 0) {
++ nr;
Sol.push_back (1);
}
return (nr <= k);
}
int main () {
fin >> n >> k;
for (int i = 1; i <= n - 1; ++ i) {
int x, y;
fin >> x >> y;
L[x].push_back (y);
L[y].push_back (x);
}
int st = 1, dr = n, mid = (st + dr) / 2, ans;
while (st <= dr) {
if (verif (mid)) {
ans = mid;
dr = mid - 1;
}
else {
st = mid + 1;
}
mid = (st + dr) / 2;
}
fout << ans << "\n";
verif (ans);
for (auto it : Sol) {
Fr[it] = 1;
}
for (int i = 1; i <= n; ++ i) {
if (Fr[i] == 0 and Sol.size () < k) {
Sol.push_back (i);
}
}
sort (Sol.begin (), Sol.end ());
for (auto it : Sol)
fout << it << ' ';
return 0;
}