Cod sursa(job #1644206)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 9 martie 2016 22:01:32
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

ifstream fin("salvare.in");
ofstream fout("salvare.out");

const int dim = 1005;
const int inf = 1000000000;

int n, k;

vector<int> tree[dim], sol, vec;

bool selected[dim];

int checkDist, selectCount;
int dp[dim];
void dfs(int node, int parent) {

	int minim = inf;
	for (vector<int>::iterator adj = tree[node].begin(); adj != tree[node].end(); ++adj) {

		if (*adj == parent)
			continue;

		dfs(*adj, node);

		dp[node] = max(dp[node], dp[*adj] + 1);
		minim = min(minim, dp[*adj] + 1);

	}

	if (dp[node] == checkDist) {

		++selectCount;
		vec.push_back(node);
		dp[node] = -checkDist - 1;
		return;

	}

	if (minim < 0 && -minim - 1 >= dp[node])
		dp[node] = minim;

}

bool verif(int dist) {

	checkDist = dist, selectCount = 0;

	vec.clear();
	memset(dp, 0, sizeof dp);

	dfs(1, 0);

	if (dp[1] >= 0) {
		++selectCount;
		vec.push_back(1);
	}

	return (selectCount <= k);

}

int main() {

	fin >> n >> k;

	for (int i = 1; i < n; ++i) {

		int x, y;
		fin >> x >> y;

		tree[x].push_back(y);
		tree[y].push_back(x);

	}

	int left = 0, right = n, ans = 0;
	while (left <= right) {

		int mid = (left + right) / 2;

		if (verif(mid)) {

			ans = mid;
			sol = vec;
			right = mid - 1;

		}
		else
			left = mid + 1;

	}

	fout << ans << '\n';

	sort(sol.begin(), sol.end());
	for (unsigned int i = 0; i < sol.size(); ++i)
		selected[sol[i]] = true;

	k -= sol.size();

	for (int i = 1; i <= n; ++i) {

		if (selected[i]) {

			fout << i << ' ';
			continue;

		}

		if (k > 0) {

			--k;
			fout << i << ' ';

		}

	}

	fout << '\n';

	return 0;

}

//Trust me, I'm the Doctor!