Cod sursa(job #754609)

Utilizator bora_marianBora marian bora_marian Data 2 iunie 2012 18:29:11
Problema Salvare Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include<fstream>
#include<algorithm>
#include<vector>
#include<queue>
#define DIM 1003
#define pb push_back
using namespace std;
vector<int>G[DIM];
priority_queue<int>Q;
int n,k,t[DIM],viz[DIM],adan[DIM],nod[DIM],sol=2147000,h,s[304];

void umplere(int k,int ac,int mx);
void catbin(int st,int dr);
void dfs(int k);
int comp(int a,int b);
int ok(int val);
void pune(int val);

int main()
{
	ifstream fin("salvare.in");
	ofstream fout("salvare.out");
	int i;
	fin>>n>>k;
	for(i=1;i<n;i++)
	{
		int a,b;
		fin>>a>>b;
		G[a].pb(b);
		G[b].pb(a);
		nod[i]=i;
	}
	nod[n]=n;
	dfs(1);
	sort(nod+1,nod+n+1,comp);
	catbin(1,n);
	pune(sol);
	sort(s+1,s+h+1);
	fout<<sol<<"\n";
	for(i=1;i<=h;i++)
		fout<<s[i]<<" ";
	return 0;
}
void catbin(int st,int dr)
{
	if(st==dr)
	{
		if(ok(st)==1)
			sol=st;
		return;
	}
	int mij=(st+dr)/2;
	if(ok(mij)==1)
	{
		if(mij<sol)
			sol=mij;
		catbin(st,mij);
	}
	else
		catbin(mij+1,dr);
}
void dfs(int k)
{
	viz[k]=1;
	int i;
	for(i=0;i<G[k].size();++i)
		if(viz[G[k][i]]==0)
		{	
			adan[G[k][i]]=adan[k]+1;
			t[G[k][i]]=k;
			dfs(G[k][i]);
		}
}
int ok(int val)
{
	int i,j;
	int nr=0;
	for(i=1;i<=n;i++)
		viz[i]=0;
	for(i=1;i<=n;i++)
	{
		if(viz[nod[i]]==0)
		{
			int nd=nod[i];
			for(j=1;j<=val;j++)
					nd=t[nd];
			nr++;
			if(nd==0)
				nd=1;
			umplere(nd,0,val);
		}
	}
	return nr<=k;
}			
void umplere(int k,int ac,int mx)
{
	if(ac<=mx)
	{
		viz[k]=1;
		int i;
		for(i=0;i<G[k].size();i++)
			if(viz[G[k][i]]==0)
				umplere(G[k][i],ac+1,mx);
	}
}
int comp(int a,int b)
{
	if(adan[a]<adan[b])
		return 0;
	return 1;
}
void pune(int val)
{
	int i,j;
	int nr=0;
	for(i=1;i<=n;i++)
		viz[i]=0;
	for(i=1;i<=n;i++)
	{
		if(viz[nod[i]]==0)
		{
			int nd=nod[i];
			for(j=1;j<=val;j++)
					nd=t[nd];
			nr++;
			if(nd==0)
				nd=1;
			s[++h]=nd;
			umplere(nd,0,val);
		}
	}
}