Cod sursa(job #644481)

Utilizator iepurasu_pasteGeorge Macovei iepurasu_paste Data 6 decembrie 2011 20:09:45
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;

#define INF 1000000005
#define pb push_back
#define minim(a,b) (a<b ? a : b)
#define maxim(a,b) (a>b ? a : b)
#define NMAX 1005

vector<int> v[NMAX],rec,rsol;

int nr,n,k,st,dr,mij;
int h[NMAX],sol,t;
char viz[NMAX];
char f[NMAX];

void dfs(int nod)
{
	int i,vec,lim=v[nod].size();
	
	viz[nod]=1;
	int thefar=0,ok=0;
	int theclose=0;
	for(i=0;i<lim;i++)
		if(!viz[vec=v[nod][i]])
		{
			dfs(vec);
			thefar=maxim(thefar,h[vec]);
			theclose=minim(theclose,h[vec]);
			ok=1;			
		}
	if(!ok)
	{
		h[nod]=1;
		return ;
	}
	
	if((theclose*-1)-1>=thefar)
	{
		h[nod]=theclose+1;
	}
	else
	{
		h[nod]=thefar+1;
		if(nod==1 || h[nod]==t+1)
		{
			h[nod]=-t;
			nr++;
			rec.pb(nod);
		}	
	}
}

int merge(int val)
{
	t=val;
	nr=0;
	memset(viz,0,sizeof(viz));
	memset(h,0,sizeof(h));
	rec.clear();
	dfs(1);
	return (nr<=k);
}

int main ()
{
	int i,a,b,cp;

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

	scanf("%d%d",&n,&k);
	if(n==k)
	{
		printf("0\n");
		for(i=1;i<=n;i++)
			printf("%d ",i);
		return 0;
	}
	for(i=1;i<n;i++)
	{	
		scanf("%d%d",&a,&b);
		v[a].pb(b);
		v[b].pb(a);
	}
	
	st=1;dr=n;
	while(st<=dr)
	{
		mij=(st+dr)/2;
		if(merge(mij))
		{
			sol=mij;
			dr=mij-1;
			rsol.clear();
			for(i=0;i<rec.size();i++)
				rsol.pb(rec[i]);
		}
		else	
			st=mij+1;
		/*printf("Pentru mij=%d nr=%d am:",mij,nr);
		for(i=1;i<=n;i++)
			printf("%d ",h[i]);
		printf("\n");*/
	}
	
	printf("%d\n",sol);

	cp=k-(rsol.size());

	for(i=0;i<rsol.size();i++)	
		f[rsol[i]]=1;

	for(i=1;i<=n;i++)
		if(cp && !f[i])
		{
			f[i]=1;
			cp--;
		}

	for(i=1;i<=n;i++)
		if(f[i])
			printf("%d ",i);

	printf("\n");
	return 0;
}