Cod sursa(job #55447)

Utilizator gcosminGheorghe Cosmin gcosmin Data 27 aprilie 2007 14:19:35
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.17 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

#define NMAX 1010
#define ff first
#define ss second
#define MP make_pair

int N, K;

vector <int> leg[NMAX];

pair<int, int> a[NMAX];

char viz[NMAX];
int tata[NMAX];

int sol[NMAX];

void get_dist(int x, int niv)
{
	a[x] = MP(niv, x);

	viz[x] = 1;
	
	for (vector <int> :: iterator it = leg[x].begin(); it != leg[x].end(); ++it)
		if (!viz[*it]) {
			tata[*it] = x;
			get_dist(*it, niv + 1);
		}
}

char vz[NMAX];
void baga(int x, int niv, int dist)
{
	if (niv == dist + 1) return;

	vz[x] = viz[x] = 1;

	for (vector <int> :: iterator it = leg[x].begin(); it != leg[x].end(); ++it)
		if (!vz[*it]) baga(*it, niv + 1, dist);
}

int get_nr(int dist)
{
	memset(viz, 0, sizeof(viz));

	int i, cur, j;

	sol[0] = 0;
	for (i = 1; i <= N; i++) {
		cur = a[i].ss;
		if (viz[cur]) continue;
	
		// merg in sus dist
		
		for (j = 1; j <= dist; j++) cur = tata[cur];

		sol[++sol[0]] = cur;

		memset(vz, 0, sizeof(vz));
		baga(cur, 0, dist);
		
	}
	
	return sol[0];
}

int cmp(pair<int, int> a, pair<int, int> b) 
{
	return a.ff > b.ff;
}

int gen(int N, int K)
{
	freopen("salvare.in", "w", stdout);

	printf("%d\n%d\n", N, K);

	int i;
	for (i = 2; i <= N; i++) {
		printf("%d %d\n", rand() % (i-1) + 1, i);
	}
fclose(stdout);
return 0;
}

int nod[NMAX];
int coada[NMAX];
int dist[NMAX];

int get_jeg()
{
	int p = 0, q = -1, i, x;

	memset(viz, 0, sizeof(viz));
	for (i = 1; i <= K; i++) coada[++q] = nod[i], dist[ nod[i] ] = 0, viz[ nod[i] ] = 1;

	int mx = 0;
	while (p <= q) {
		x = coada[p];
		p++;

		for (vector <int> :: iterator it = leg[x].begin(); it != leg[x].end(); ++it)
			if (!viz[*it]) {
				coada[++q] = *it;
				viz[*it] = 1;
				dist[*it] = dist[x] + 1;
				if (dist[*it] > mx) mx = dist[*it];
			}
	}

	return mx;
}

int ss = NMAX;
void get_brute(int k, int last)
{
	if (k == K + 1) {
		int q = get_jeg();
		if (q < ss) ss = q;
/*		if (q == 3) {
			for (int j = 1; j <= K; j++) printf("%d ", nod[j]);
			printf("\n");
		}
*/
		return;
	}

	int i;

	for (i = last + 1; i <= N; i++) {
		nod[k] = i;
		get_brute(k + 1, i);
	}
}

int main()
{
//	srand(14234);
//	gen(1000, 30);

	int i, x, y, q;

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

	scanf("%d %d", &N, &K);

	for (i = 1; i < N; i++) {
		scanf("%d %d", &x, &y);

		leg[x].push_back(y);
		leg[y].push_back(x);
	}

	tata[1] = 1;
	get_dist(1, 0);
	sort(a + 1, a + N + 1, cmp);

//	for (i = 1; i <= N; i++) printf("%d %d | ", a[i].ff, a[i].ss);

	int step;

	for (step = 1; step <= a[1].first; step <<= 1);

	int rez = 0;
	for (; step; step >>= 1) {
		q = get_nr(rez + step);

		if (q > K) rez += step;
	}

//	printf("%d\n", get_nr(1));
	
	printf("%d\n", rez + 1);

//	get_brute(1, 0);
//	printf("%d\n", ss);

	get_nr(rez + 1);

	memset(viz, 0, sizeof(viz));

	for (i = 1; i <= sol[0]; i++) viz[ sol[i] ] = 1;

	for (i = 1; i <= N && sol[0] < K; i++) 
		if (!viz[i]) sol[ ++sol[0] ] = i;

	sort(sol + 1, sol + sol[0] + 1);

	for (i = 1; i <= sol[0]; i++) printf("%d ", sol[i]);
	printf("\n");

/*	printf("------\n");

	get_nr(3);
	printf("%d\n", sol[0]);
	for (i = 1; i <= sol[0]; i++) printf("%d ", sol[i]);
	printf("\n");
*/

fclose(stdin);
fclose(stdout);
return 0;
}