Cod sursa(job #720362)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 22 martie 2012 16:46:51
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <stdio.h>
#include <vector>
#define NMAX 1005
#define INF 1000000000
#define pb push_back
using namespace std;
int n,k,dad[NMAX],st[NMAX],r,rez,t;
vector <int> A[NMAX];
char viz[NMAX],marc[NMAX];
int dist[NMAX],when[NMAX];
void read()
{
	scanf("%d%d",&n,&k);
	int i,a,b;
	for (i=1; i<n; i++)
	{
		scanf("%d%d",&a,&b);
		A[a].pb(b);
		A[b].pb(a);
	}
}
void dfs(int nod)
{
	viz[nod]=1;
	int i,vec;
	for (i=0; i<A[nod].size(); i++)
	{
		vec=A[nod][i];
		if (!viz[vec])
		{
			dad[vec]=nod;
			dfs(vec);
		}
	}
	st[++r]=nod;
}
inline int min(int x,int y)
{
	return x<y ? x : y;
}
int ok(int val)
{
	int i,j,nod,vec;
	t=0;
	for (i=1; i<=n; i++)
	{
		nod=st[i]; marc[nod]=0;
		dist[nod]=INF; when[nod]=val;
		for (j=0; j<A[nod].size(); j++)
		{
			vec=A[nod][j];
			if (dad[vec]==nod)
			{
				dist[nod]=min(dist[nod],dist[vec]+1);
				when[nod]=min(when[nod],when[vec]-1);
			}
		}
		if (when[nod]>=dist[nod])
		{
			when[nod]=INF; 
			continue ;
		}
		if (nod==1 || when[nod]-1<0)
		{
			marc[nod]=1; t++;
			dist[nod]=0; when[nod]=INF;
			continue ;
		}
	}
	return t<=k;
}
int cbin()
{
	int i,step=(1<<10);
	for (i=-1; step; step>>=1)
		if (!ok(i+step))
			i+=step;
	return ++i;
}
void complete()
{
	ok(rez);
	int i,cnt=k-t;
	for (i=1; i<=n && cnt; i++)
		if (!marc[i])
			marc[i]=1,cnt--;
	printf("%d\n",rez);
	for (i=1; i<=n; i++)
		if (marc[i])
			printf("%d ",i);
	printf("\n");
}
int main()
{
	freopen("salvare.in","r",stdin);
	freopen("salvare.out","w",stdout);
	read();
	dfs(1);
	rez=cbin();
	complete();
	return 0;
}