Cod sursa(job #2246830)

Utilizator DawlauAndrei Blahovici Dawlau Data 27 septembrie 2018 16:51:04
Problema Salvare Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <list>
#include <bitset>
#include <algorithm>
#include <vector>
#include <climits>

using namespace std;

const int maxV = 1000;
const int Inf = INT_MAX;

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

list <int> adjList[1 + maxV];

bitset <1 + maxV> marked;
bitset <1 + maxV> sol;

vector <int> dist;

int V, E, K;

void resizeVectors() {

	dist.resize(1 + V);
}

void DFS(int node, int father, int currDist) {

	for (const int &nextNode : adjList[node])
		if (nextNode != father) {

			DFS(nextNode, node, currDist);
			dist[node] = min(dist[node], dist[nextNode] - 1);
		}

	if (adjList[node].size() == 1)
		dist[node] = currDist;
	else if (dist[node] == 0)
		marked[node] = true;
	else if (dist[node] == -1)
		dist[node] = currDist;
}

inline int check(const int &currDist) {

	fill(dist.begin(), dist.end(), Inf);
	marked.reset();

	DFS(1, 0, currDist);

	int usedNodes = 0;
	for (int node = 1; node <= V; ++node)
		if (marked[node])
			++usedNodes;

	return usedNodes;
}

int main() {

	fin >> V >> K;

	if (V == K) {

		fout << 0 << '\n';
		for (int node = 1; node <= V; ++node)
			fout << node << ' ';
		return 0;
	}

	E = V - 1;

	resizeVectors();

	for (; E; --E) {

		int from, to;
		fin >> from >> to;

		adjList[from].push_back(to);
		adjList[to].push_back(from);
	}

	int low = 1, high = V - 1;
	int ans = 0, usedNodes = 0;

	while (low <= high) {

		int mid = (low + high) / 2;
		int checker = check(mid);

		if (checker <= K) {

			ans = mid;
			usedNodes = checker;
			high = mid - 1;

			for (int node = 1; node <= V; ++node)
				sol[node] = marked[node];
		}
		else low = mid + 1;
	}

	fout << ans << '\n';

	K -= usedNodes;
	for (int node = 1; K; ++node)
		if (!sol[node]) {

			sol[node] = true;
			--K;
		}

	for (int node = 1; node <= V; ++node)
		if (sol[node] == true)
			fout << node << ' ';
}