Cod sursa(job #374069)

Utilizator otilia_sOtilia Stretcu otilia_s Data 15 decembrie 2009 21:17:52
Problema Salvare Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <cstdio>
#include <vector>
#include <deque>
#define NMAX 1003
using namespace std;
vector <int> v[NMAX];
vector <int> sol;
deque <int> fr;
int nv[NMAX],ind[NMAX],grad[NMAX],n,k;
int luat[NMAX];


void citire()
{
	FILE *fin=fopen("salvare.in","r");
	fscanf(fin,"%d %d",&n,&k);
	int i;
	for (i=1;i<n;++i)
	{ int x,y;
		fscanf(fin,"%d %d",&x,&y);
		v[x].push_back(y); v[y].push_back(x);		
	}
	for (i=1;i<=n;++i) nv[i]=v[i].size();
	fclose(fin);
}

int main()
{
	citire(); 
	if (k==n) { FILE *fout=fopen("salvare.out","w");
			    fprintf(fout,"0\n");
				for (int i=1;i<=n;++i)fprintf(fout,"%d ",i);
				fclose(fout);
				return 0;
			  }
	int ls,ld,MIN,m,nl,i,r;
	ls=1;ld=n;
	MIN=n+2;
	while (ls<=ld)
	{
		m=(ld+ls)/2; //caut binar k
		memset(luat,0,sizeof(luat));
		nl=0; r=n; fr.clear();
		for (i=1;i<=n;++i) 
			{ if (nv[i]==1) { fr.push_back(i);  luat[i]=1; r--;}
			  grad[i]=nv[i]; ind[i]=m;
			}
		while (fr.size()>1 && r)
		{
			int x=fr.front(); fr.pop_front();
			for (i=0;i<nv[x];++i)
				if (!luat[v[x][i]]) 
				{   int p=v[x][i];
					ind[p]=min(ind[p],ind[x]-1);
					grad[p]--;
					if (grad[p]<=1)
					{
						fr.push_back(p);
						if (ind[p]==0) {luat[p]=2; ind[p]=m+1; nl++;}
						   else luat[p]=1;
						r--;
					}
				}			
		}
		if (fr.size()==2)  
		{			
			int x=fr.front(),y=fr.back(); 
			if (luat[x]==2 || luat[y]==2) fr.clear();
			   else //niciuna nu e salvare
			   {
				/*fr.pop_front();
				ind[y]=min(ind[y],ind[x]-1);
				if (ind[y]==0)	{luat[y]=2; nl++;}*/
				fr.clear(); luat[y]=2; nl++;
			   }
		}
		if (fr.size()==1 && luat[fr.front()]<2)  {luat[fr.front()]=2; nl++;}
		if (nl>k) { ls=m+1;}
			else			
			{
				ld=m-1;
				MIN=m; 
				sol.clear();
				for (i=1;i<=n;++i) 
					if (luat[i]==2) sol.push_back(i);				
			}
	}		
	
	FILE *fout=fopen("salvare.out","w");
	fprintf(fout,"%d\n",MIN);
	i=0;  int x=1;
	while (nl<k && i<sol.size() && x<=sol.back())
	 {
		while (i<sol.size() && x<sol[i] && nl<k) 
		 {fprintf(fout,"%d ",x); x++; nl++;}
		fprintf(fout,"%d ",sol[i]);
		x++; i++;
	 }	
	while (nl<k) 
	 {
		while (x<=sol.back()) x++;
		fprintf(fout,"%d ",x); x++; nl++;
	 }
	while (i<sol.size()) {fprintf(fout,"%d ",sol[i]); i++;}
	fclose(fout);
	return 0;
}