Cod sursa(job #59096)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 7 mai 2007 23:42:05
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

#define nmax 1024
#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define sz size()
#define pb push_back
#define pt(i) (1<<(i))

vector <int> G[nmax];
int n,k,sol,A[nmax],g[nmax],cod[nmax],Q,sf,bal[nmax],B[nmax];

int doit(int x)
{
	int i,j,ii,t=0;
	sf=-1;
	FOR(i,0,n)
	{
		g[i]=G[i].sz;
		bal[i]=0;
		B[i]=x+1,A[i]=x;
		if(g[i]<=1)
			bal[i]=2,cod[++sf]=i,A[i]=x;
	}
	FOR(Q,0,sf+1)
	{
		i=cod[Q];
		if(A[i]==0)
			t++,bal[i]=1,B[i]=0;
		FOR(ii,0,G[i].sz)
		{
			j=G[i][ii];
			g[j]--;
			if(g[j]<=1&&!bal[j])
				cod[++sf]=j,bal[j]=2;
			if(B[i]>A[i])
				A[j]=min(A[j],A[i]-1);
			B[j]=min(B[j],B[i]+1);
		}		
	}
	if(A[cod[sf]]<=x&&B[i]>A[i])
		t++,bal[cod[sf]]=1;
	FOR(i,0,n)
	{
		if(k<t)
			return 0;
		if(k==t)
			return 1;
		if(bal[i]!=1)
			bal[i]=1,t++;
	}
}

int main()
{
	freopen("salvare.in","r",stdin);
	freopen("salvare.out","w",stdout);
	scanf("%d",&n);
	scanf("%d",&k);
	int ii,i,j;
	FOR(ii,1,n)
	{
		scanf("%d %d",&i,&j);
		i--,j--;
		G[i].pb(j);
		G[j].pb(i);
	}
	for(i=10,sol=0;i>=0;--i)
		if(!doit(sol+pt(i)))
			sol+=pt(i);
	doit(sol+1);
	printf("%d\n",sol+1);
	FOR(i,0,n)
		if(bal[i]==1)
			printf("%d ",i+1);
	printf("\n");
	return 0;
}