Cod sursa(job #55429)

Utilizator dominoMircea Pasoi domino Data 27 aprilie 2007 13:59:05
Problema Salvare Scor Ascuns
Compilator cpp Status done
Runda Marime 2.23 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

#define MAXN 1005

int N, K;
vector<int> con[MAXN];
int p[MAXN];
int dist[MAXN][MAXN];

vector< pair<int, int> > x;

int insol[MAXN];
char used[MAXN];

void dfs( int k, int alt, int father )
{
	if (used[k])
		return;
	used[k] = 1;
	p[k] = father;

	x.push_back( make_pair(alt, k) );

	vector< int > :: iterator it;
	for (it = con[k].begin(); it != con[k].end(); it++)
		dfs( *it, alt + 1, k );

}

inline void markUsed( int k, int D )
{
	for (int i = 1; i <= N; i++)
		if (dist[k][i] <= D)
			used[i] = 1;
}

inline int isOK( int D )
{
	memset(used, 0, sizeof(used));
	memset(insol, 0, sizeof(insol));

	for (int i = 0; i < N; i++)
	{
		int k = x[i].second;
		if (used[k])
			continue;

		for (int step = 0; step < D && k != 1; step++)
			k = p[k];

		insol[k] = 1;
		markUsed(k, D);
	}

	int NR = 0;
	for (int i = 1; i <= N; i++)
		NR += insol[i];
	return NR <= K;
}

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

queue<int> Q;
inline void getDist( int k )
{
	for (; !Q.empty(); Q.pop());
	dist[k][k] = 0;

	for (Q.push(k); !Q.empty(); Q.pop())
	{
		int i = Q.front();
		vector<int> :: iterator it;
		for (it = con[i].begin(); it != con[i].end(); it++)
			if (dist[k][i] + 1 < dist[k][*it])
			{
				dist[k][*it] = dist[k][i] + 1;
				Q.push(*it);
			}
	}
}

vector<int> SOL;

int main()
{
	freopen("salvare.in", "rt", stdin);
	freopen("salvare.out", "wt", stdout);

	scanf("%d %d", &N, &K);
	for (int i = 0; i < N - 1; i++)
	{
		int a, b;
		scanf("%d %d", &a, &b);
		con[a].push_back(b);
		con[b].push_back(a);
	}

	dfs(1, 1, 1);
	sort( x.begin(), x.end(), cmp );

	memset( dist, 0x3f, sizeof(dist) );
	for (int i = 1; i <= N; i++)
		getDist(i);


	int sol, step;
	for (sol = -1, step = 512; step; step >>= 1)
		if (sol + step <= N && !isOK(sol + step))
			sol += step;

	sol++;
	printf("%d\n", sol);
	
	isOK(sol);
	int SNR = K;
	for (int i = 1; i <= N; i++)
		if (insol[i])
			SOL.push_back(i),
			SNR--;

	int p = 1;
	for (; SNR; SNR--)
	{
		for (; insol[p]; p++);
		insol[p] = 1;
		SOL.push_back(p);
	}

	sort( SOL.begin(), SOL.end() );
	printf("%d", SOL[0]);
	for (int i = 1; i < (int)SOL.size(); i++)
		printf(" %d", SOL[i]);
	printf("\n");

	return 0;
}