Cod sursa(job #554275)

Utilizator klamathixMihai Calancea klamathix Data 14 martie 2011 18:42:39
Problema Salvare Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#define f first
#define s second
const int maxn = 1005;
using namespace std;

int i , j , k , n , a, b , step , ans , mins[maxn] , aux[maxn] , dg[maxn] , last;
bool used[maxn] , sol[maxn];

queue <pair <int , int > > Q;
vector <int> G[maxn];

struct e {
	int x , y;
} edges[maxn];

void delete_edge (int u , int v) {
	int i;
	
	G[v].pop_back();
	
	for( i = 0 ; i < G[u].size() ; ++i ) 
		if ( G[u][i] == v ) {
			G[u].erase(G[u].begin() + i);
			return;
		}
}

int count (int dist)
{
	int i , cnt = 0;
	memset( used, 0 , sizeof(used));
	
	
	for( i = 1 ; i < n ; ++i ) {
		G[edges[i].x].push_back(edges[i].y);
		G[edges[i].y].push_back(edges[i].x);
	}
	
	for( i = 1 ; i <= n ; ++i ) {
		aux[i] = dg[i];
		if( aux[i] == 1 )
			Q.push( make_pair( i , dist ) );
		else mins[i] = n + 1;
	}
	
	for( ; ! Q.empty() ; ) {
		pair <int , int > act = Q.front();
		Q.pop();
		
		
		if ( G[act.f].empty()) continue;
		
		int dad = G[act.f].back();
		
		aux[dad]-- , delete_edge( dad , act.f );
		
		mins[dad] = min( mins[dad] , act.second);
		
		if ( aux[dad] == 1 )  {
			if( mins[dad] - 1 == 0) {
				used[dad] = 1;
				cnt++;
			Q.push( make_pair( dad , dist) );
			}
			else
				Q.push(make_pair(dad , mins[dad] - 1));
		}
		
	}
	
	return cnt;
	
}

int main()
{
	freopen("salvare.in","r",stdin);
	freopen("salvare.out","w",stdout);
	
	scanf("%d\n%d",&n,&k);
	
	for( i = 1 ; i < n ; ++i ) {
		scanf("%d %d",&a,&b);
		dg[a]++ , dg[b]++;
		edges[i].x = a , edges[i].y = b;
	}
	
	if ( n == k ) {
		printf("0\n");
		for( i = 1 ; i <= n ; ++i )
			printf("%d ",i);
		return 0;
	}
	
	for( step = 1 ; step <= n ; step <<= 1 );
		
	ans = step - 1;
	step >>= 1;
	
	for( ; step > 1 ; step >>= 1 ) {
		int t = count( ans - step );
		if ( t <= k ) { 
			ans -= step;
			last = t;
			for( i = 1 ; i <= n ; ++i ) sol[i] = used[i];
		}
	}
	
	printf("%d\n",ans);
	
	for ( i = 1 ; i <= n ; ++i )
		if ( last < k && !sol[i]) {
			printf("%d ",i);
			last++;
		}
		else {
			if ( sol[i] )
				printf("%d ",i);
		}
		
		
		
return 0;
}