Cod sursa(job #55399)

Utilizator dominoMircea Pasoi domino Data 27 aprilie 2007 13:06:44
Problema Salvare Scor Ascuns
Compilator cpp Status done
Runda Marime 1.81 kb
#include <stdio.h>
#include <queue>
#include <vector>
#include <string.h>

#define inf (int)1e9
#define nmax 1005
#define pb push_back

using namespace std;
typedef pair<int,int> ii;

int K,i,n1,n2,n,k,bag[nmax],grad[nmax],nod,scos[nmax],c[nmax];
vector <int> e[nmax];
ii aux;
priority_queue < ii,vector<ii>,greater<ii> > Q;

inline int max(int a,int b) {
	if(a > b) return a;
	else return b;
}

int salvari(int x) {
	int i,K = 0,ultim = 0;
	while(!Q.empty()) Q.pop();
	for(i = 1; i <= n; i++) {
		Q.push(ii(e[i].size(),i));
		grad[i] = e[i].size();
	}
	memset(scos,0,sizeof(scos));
	memset(bag,0,sizeof(bag));
	for(i = 1; i <= n; i++) c[i] = -inf;
	for(i = 1; i <= n; i++) if(grad[i] == 1) c[i] = 0;
	while(!Q.empty()) {
		aux = Q.top();
		Q.pop();
		if(aux.first == grad[aux.second]) {
			nod = aux.second;
			if(c[nod] == x) {
				K++;
				bag[nod] = 1;
				c[nod] = - x - 1;
			}
			scos[nod] = 1;
			for(i = 0; i < (int)e[nod].size(); i++)
				if(!scos[e[nod][i]]) {
					grad[e[nod][i]]--;
					Q.push(ii(grad[e[nod][i]],e[nod][i]));
					if(grad[e[nod][i]] == 0 && c[e[nod][i]] == 0) c[e[nod][i]] = -inf;
					c[e[nod][i]] = max(c[e[nod][i]],c[nod] + 1);
				}
			ultim = nod;
		}
	}
	if(c[ultim] >= 0) {
		K++;
		bag[ultim] = 1;
	}
	for(i = 1; (i <= n) && (K < k); i++) 
		if(!bag[i]) {
			bag[i] = 1;
			K++;
		}
	return K;
}

int cauta(int f,int l) {
	int rez = inf;
	while(f <= l) {
		int mi = (f + l) / 2;
		int x = salvari(mi);
		if(x <= k) {
			rez = mi;
			l = mi - 1;
		}
		else f = mi + 1;
	}
	return rez;
}

int main() {
	freopen("salvare.in","r",stdin);
	freopen("salvare.out","w",stdout);

	scanf("%d%d",&n,&k);
	for(i = 1; i < n; i++) {
		scanf("%d%d",&n1,&n2);
		e[n1].pb(n2);
		e[n2].pb(n1);
	}

	int x = cauta(0,n);

	printf("%d\n",x);
	salvari(x);
	for(i = 1; i <= n; i++) if(bag[i]) printf("%d ",i); printf("\n");

	return 0;
}