Cod sursa(job #753894)

Utilizator darrenRares Buhai darren Data 30 mai 2012 18:40:50
Problema Salvare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <cstring>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

const int INF = 0x3f3f3f3f;

int N, K;
vector<int> V[1002];
bool S[1002], put[1002];
int maxDist[1002], limit, used;

void Dfs(int x)
{
	S[x] = true;
	
	maxDist[x] = -INF;
	
	int size = 0, minval = INF;
	for (vector<int>::iterator it = V[x].begin(); it != V[x].end(); ++it)
		if (!S[*it])
		{
			++size;
			
			Dfs(*it);
			
			minval = min(minval, maxDist[*it] + 1);
			if (!put[x] && maxDist[*it] + 1 <= limit)
			{
				++used;
				maxDist[x] = -limit - 1;
				put[x] = true;
			}
			else if (!put[x])
				maxDist[x] = max(maxDist[x], maxDist[*it] + 1);
		}
	
	//if (-minval + 1 >= maxDist[x])
	//	maxDist[x] = -minval;
	if (size == 0)
		maxDist[x] = 0;
}
bool Test(int x)
{
	memset(S, 0, sizeof(S));
	memset(put, 0, sizeof(put));
	limit = x;
	used = 0;
	Dfs(1);
	
	if (maxDist[1] >= 0)
	{
		 ++used;
		 put[1] = true;
	 }
	
	if (used <= K) return true;
	return false;
}

int main()
{
	ifstream fin("salvare.in");
	ofstream fout("salvare.out");
	
	fin >> N >> K;
	for (int i = 1, nod1, nod2; i < N; ++i)
	{
		fin >> nod1 >> nod2;
		V[nod1].push_back(nod2);
		V[nod2].push_back(nod1);
	}
	
	int step = 1 << 10, result;
	for (result = step + 1; step; step >>= 1)
		if (result - step > 0 && Test(result - step))
			result -= step;
	
	if (K >= N)
	{
		fout << "0\n";
		for (int i = 1; i <= N; ++i)
			fout << i << ' ';
		fout << '\n';
		
		fin.close();
		fout.close();
		return 0;
	}
	
	fout << result << '\n';
	Test(result);
	
	int know = K - used;
	for (int i = 1; know && i <= N; ++i)
		if (!put[i])
		{
			put[i] = true;
			--know;
		}
	
	for (int i = 1; i <= N; ++i)
		if (put[i])
			fout << i << ' ';
	fout << '\n';
	
	fin.close();
	fout.close();
}