Cod sursa(job #168495)

Utilizator sanaDascalu Laurentiu sana Data 31 martie 2008 15:39:38
Problema Salvare Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#include <vector>

using namespace std;

#define FILEIN "salvare.in"
#define FILEOUT "salvare.out"
#define MAX(A,B) (A)>(B)?(A):(B)
#define INF -10000000

void dfs(int node, vector<vector <int> > &data, vector<int> &visited,
		vector<int> &cost, vector<int> &taken, int &aux, int &mid) {
	visited[node]=1;

	if (data[node].size()==1 && node!=1) {
		cost[node]=0;
		taken[node]=-1;
		return;
	}

	for (vector<int>::iterator it=data[node].begin(); it!=data[node].end(); it++) {
		if (!visited[*it]) {
			taken[*it]=taken[node]-1;
			dfs(*it, data, visited, cost, taken, aux, mid);
			cost[node]=MAX(cost[node],cost[*it]+1);
			taken[node]=MAX(taken[node],taken[*it]-1);
		}
	}

	if (cost[node]<=taken[node])
		cost[node]=-taken[node]-1;
	if (cost[node]==mid) {
		aux++;
		cost[node]=-mid-1;
		taken[node]=mid;
	}
}

int main() {
	int N, K;
	int a, b, mid, aux;
	vector<vector <int> > data;
	vector<int> visited, cost, taken;
	ifstream fin(FILEIN,ios::in);
	ofstream fout(FILEOUT,ios::out);

	fin >> N >> K;
	for (int i=0; i<=N; i++) {
		data.push_back(vector<int>());
		visited.push_back(0);
		taken.push_back(0);
		cost.push_back(0);
	}

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

		fin >> a >> b;
		data[a].push_back(b);
		data[b].push_back(a);
	}

	fin.close();

	if (K>=N) {
		fout << 0 << endl;
		for (int i=1; i<=N; i++)
			fout << i;
		fout.close();
		return 0;
	}

	a=1;
	b=N;
	mid=(a+b)/2;

	while (!(a==b || a==mid)) {
		aux=0;
		mid=(a+b)/2;
		for (int i=1; i<=N; i++) {
			visited[i]=0;
			cost[i]=INF;
			taken[i]=-1;
		}

		dfs(1, data, visited, cost, taken, aux, mid);

		if (cost[1]>=0 && taken[1]<cost[1]) {
			aux++;
			cost[1]=-mid-1;
		}

		if (aux>K)
			a=mid+1;
		else
			b=mid;
	}

	fout << mid << endl;
	int count=0;
	for (int i=1; i<=N; i++) {
		if (cost[i]==(-mid-1)) {
			fout << i << " ";
			count++;
		}
	}

	if (count<K) {
		for (int i=1; i<=N; i++) {
			if (cost[i]!=(-mid-1)) {
				fout << i << " ";
				count++;
				if (count==K)
					break;
			}
		}
	}

	fout.close();
	return 0;
}