Pagini recente » Autentificare | Cod sursa (job #2957776) | Cod sursa (job #2185091) | Cod sursa (job #3286792) | Cod sursa (job #482382)
Cod sursa(job #482382)
#include <algorithm>
#include <stdio.h>
#include <vector>
#define MAX 1024
#define pb push_back
using namespace std;
int n, k, minM, puse;
vector <int> vctDrum[MAX];
int sel[MAX], calc[MAX], pus[MAX];
inline void test(int x, int lim)
{
int valMin = 0, valMax = 0;
sel[x] = 1;
for (int i = 0; i < vctDrum[x].size(); i++)
if (!sel[vctDrum[x][i]])
{
test(vctDrum[x][i], lim);
valMax = max(valMax, calc[vctDrum[x][i]] + 1);
valMin = min(valMin, calc[vctDrum[x][i]] + 1);
}
if (-valMin >= valMax)
calc[x] = valMin;
else calc[x] = valMax;
if (calc[x] >= lim)
calc[x] = -lim;
}
inline void cautaBin(int fr, int ls)
{
if (fr > ls)
return;
int med = (fr + ls) / 2;
memset(calc, 0, sizeof(calc));
memset(sel, 0, sizeof(sel));
test(1, med);
int lt = 0;
if (calc[1] > 0 || n == 1)
calc[1] = -med;
for (int i = 1; i <= n; i++)
lt += (calc[i] == -med)? 1 : 0;
if (lt <= k)
{
minM = med;
puse = lt;
for (int i = 1; i <= n; i++)
pus[i] = (calc[i] == -med)? 1 : 0;
cautaBin(fr, med - 1);
}
else cautaBin(med + 1, ls);
}
int main()
{
freopen("salvare.in", "r", stdin);
freopen("salvare.out", "w", stdout);
scanf("%d %d", &n, &k);
for (int i = 1; i < n; i++)
{
int nod1, nod2;
scanf("%d %d", &nod1, &nod2);
vctDrum[nod1].pb(nod2);
vctDrum[nod2].pb(nod1);
}
cautaBin(0, n);
vector <int> vctSol;
int dp = k - puse;
for (int i = 1; i <= n; i++)
{
dp += pus[i];
if (dp)
{
vctSol.pb(i);
dp--;
}
}
sort(vctSol.begin(), vctSol.end());
printf("%d\n", minM + 1);
for (int i = 0; i < vctSol.size(); i++)
printf("%d ", vctSol[i]);
fclose(stdin);
fclose(stdout);
return 0;
}