Cod sursa(job #55402)

Utilizator dominoMircea Pasoi domino Data 27 aprilie 2007 13:09:26
Problema Salvare Scor Ascuns
Compilator cpp Status done
Runda Marime 2.14 kb
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <vector>

using namespace std;

const int maxN = 1001;

vector<int> niv[ maxN ];
vector<int> fii[ maxN ];
vector<int> sol;

int tata[ maxN ];

int mark[ maxN ];
int n,k;
int nvm;
int nvmc;

void DFS( int nodc, int nvmm, int nvcc )
{
	int i;
	if ( nvcc > nvmm ) return;
	mark[ nodc ] = 1;
	for ( i = 0 ; i < fii[ nodc ].size(); i++ )
		if ( !mark[ fii[ nodc ][ i ] ] )
			DFS( fii[ nodc ][ i ], nvmm, nvcc+1 );
}



int mere_treaba( int distm )
{
	int x = 0;
	int i,j=0;
	int dist = 0;
	nvmc = nvm;
	memset( mark, 0 ,sizeof( mark ) );

	while ( nvm && j <= k )
	{
		x = 0;
		while ( x == 0 && nvm )
		{
			for ( i = 0; i < niv[ nvm ].size(); i++ )
				if ( !mark[ niv[ nvm ][ i ] ] ) { x+=1; break; }
			if ( !x ) nvm--;
		}

		if ( nvm == 0 ) break;
		else
		{
			x = niv[ nvm ][ i ];
			dist = 0;
			while ( dist < distm && tata[ x ] )
			{
			x = tata[ x ];
				dist++;
			}
			DFS( x, distm, 0 );
			sol.push_back( x );		
		}
		j++;
	}
	if ( ( nvm == 0 ) && ( j <= k ) ) return 1;
	nvm = nvmc;
	return 0;
}

void clasifica( int nodc, int nv, int tati )
{
	int i;
	if ( nv > nvm ) nvm = nv;
	tata[ nodc ] = tati;
	mark[ nodc ] = 1;
	niv[ nv ].push_back( nodc );
	for ( i = 0; i < fii[ nodc ].size(); i++ )
		if ( !mark[ fii[ nodc ][ i ] ] )
			clasifica( fii[ nodc ][ i ], nv+1, nodc );
}	

int main()
{
	int i,x = 0;
	int step;
	int a,b;

	srand( time(0) );

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

	scanf("%d\n%d\n", &n, &k );

	for ( i = 1; i < n; i++ )
	{
		scanf("%d %d\n", &a, &b );

		fii[ a ].push_back( b );
		fii[ b ].push_back( a );
	}

	clasifica( 1, 1, 0 );

	for ( step = 1; step < n; step <<=1 );
	for ( i = 0; step; step >>= 1 )
		if ( i + step < n )
			if ( !mere_treaba( i + step ) ) i += step;

	mere_treaba( i + 1 );

	printf("%d\n", i+1 );
	memset( mark, 0, sizeof ( mark ) );
	for ( i = 0; i < sol.size(); i++ )
	{
		printf("%d ", sol[ i ] );
		mark[ sol[i] ] = 1;
	}
	for ( i = sol.size(); i < k; i++ )
	{
		while ( !x || mark[x] )
			x = rand()%(n+1);
		printf("%d ", x );
	}
		
	
	fclose(stdin);
	fclose(stdout);

	return 0;
}