Cod sursa(job #356119)

Utilizator FoaiaFoaia de Hartie Foaia Data 13 octombrie 2009 16:49:41
Problema Salvare Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#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;
	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);
	for (int i = 0; i < vctSol.size(); i++)
		printf("%d ", vctSol[i]);

	fclose(stdin);
	fclose(stdout);
	return 0;
}