Cod sursa(job #171346)

Utilizator lordbogyRaducanu Bogdan lordbogy Data 4 aprilie 2008 02:34:28
Problema Salvare Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <set>
using namespace std;

const int MAXN = 10001;
int N, M;
vector<int> ADJ[MAXN];


void read(){
	ifstream fin("salvare.in");
	fin >> N >> M;
	int a, b;
	for(int i = 0; i + 1 < N; i++){
		fin >> a >> b;
		ADJ[a].push_back(b);
		ADJ[b].push_back(a);
	}
}
void read2(){
	ifstream fin("salvare.in");
	fin >> N >> M;
	for(int i = 1; i <= N; i++){
		int cn; fin >> cn;
		int v;
		for(int j = 0; j < cn; j++) {
			fin >> v;
			ADJ[v].push_back(i);
			ADJ[i].push_back(v);
		}
	}
}
vector<int> getSol(int dmax){
	queue<int> q;
	set<int> adj[MAXN];
	int mmin[MAXN];
	bool was[MAXN];
	vector<int> ret;
	bool isSol[MAXN];
	for(int i = 1; i <= N; i++) {
		mmin[i] = dmax;
		was[i] = 0;
		isSol[i] = 0;
		for(int j = 0; j < ADJ[i].size(); j++) adj[i].insert(ADJ[i][j]);
		if(adj[i].size() == 1){
			q.push(i);
			was[i] = 1;
		}
	}

	while(q.size() > 0){
		int c = q.front(); q.pop();
		//cout << "scot " << c << endl;
		if(adj[c].size() == 0) continue;
		int nb = *adj[c].begin();

		adj[nb].erase(c);
		if(adj[nb].size() <= 1 && !was[nb]) {
			was[nb] = 1;
			q.push(nb);
		}

		if(mmin[c] == 3 * dmax || mmin[nb] > mmin[c] - 1) mmin[nb] = mmin[c] - 1;
		if(mmin[nb] == 0) {
			if(!isSol[nb]) {
				ret.push_back(nb);
				isSol[nb] = 1;
			}
			mmin[nb] = 3 * dmax;
		}
	}
	return ret;
}

void doit(){
	int lo = 0, hi = N;
	int best = 100000;
	vector<int> sol;
	vector<int> bestSol;
	while(lo <= hi){
		int m = (lo + hi) >> 1;
		sol = getSol(m);
		if(sol.size() > M) lo = m + 1;
		if(sol.size() <= M) {
			hi = m - 1, best = m;
			bestSol.clear();
			bestSol.insert(bestSol.begin(), sol.begin(), sol.end()); 
		}
	}
	ofstream fout("salvare.out");
	fout << best << endl;
	bool was[MAXN];
	memset(was, 0, N+1);
	int i;
	for(i = 0; i < bestSol.size(); i++) {
		was[bestSol[i]] = 1;
		M--;
	}
	for(i = 1; i <= N && M; i++){
		if(!was[i]) {
			bestSol.push_back(i);
			M--;
		}
	}
	sort(bestSol.begin(), bestSol.end());
	for(i = 0; i < bestSol.size(); i++) fout << bestSol[i] << " ";
	fout.close();
}

int main() {
	read();
	doit();
	//vector<int> sol = getSol(9);
	//for(int i = 0; i < sol.size(); i++) cout << sol[i] << " " ;
	return 0;
}