Cod sursa(job #754785)

Utilizator bora_marianBora marian bora_marian Data 3 iunie 2012 14:04:02
Problema Salvare Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include<fstream>
#include<iostream>
#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],vec[DIM],stan[DIM],pus[DIM];

void catbin(int st,int dr);
void dfs(int k);
int ok(int val);
void test(int k,int val);
int max(int a,int b);
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);
	for(i=1;i<=n;i++)
		viz[i]=0;
	catbin(1,n);
	pune(sol);
	if(sol<k)
		for(i=1;i<=n&& s[0]<k;i++)
			if(pus[i]==0)
				s[++s[0]]=i;
	fout<<sol<<"\n";
	sort(s+1,s+s[0]+1);
	for(i=1;i<=s[0];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 comp(int a,int b)
{
	if(adan[a]<adan[b])
		return 0;
	return 1;
}
void test(int k,int val)
{
	int i;
	viz[k]=1;
	for(i=0;i<G[k].size();++i)
		if(viz[G[k][i]]==0)
			test(G[k][i],val);
	//cout<<k<<" "<<stan[k]<<" "<<t[k]<<endl;
	if(stan[k]!=2*val)
	{
		if(stan[k]<val)
		{
			if(stan[t[k]]<=val)
				stan[t[k]]=max(stan[k]+1,stan[t[k]]);
			else
				if(2*val-stan[t[k]]<=stan[k])
					stan[t[k]]=stan[k]+1;
		}
		else
			if(2*val-stan[k]>stan[t[k]])
				stan[t[k]]=stan[k]+1;
	}
	else
		stan[t[k]]=max(0,stan[t[k]]);
		
}
int max(int a,int b)
{
	if(a>b)
		return a;
	return b;
}
int ok(int val)
{
	int i;
	for(i=1;i<=n;i++)
		viz[i]=0,stan[i]=0;
	test(1,val);
	int nr=0;
	for(i=1;i<=n;i++)
		if(stan[i]==val)
			nr++;
	if(stan[1]!=val && stan[1]<val)
		nr++;
	return nr<=k;
}
void pune(int val)
{
	int i;
	for(i=1;i<=n;i++)
		viz[i]=0,stan[i]=0;
	test(1,val);
	int nr=0;
	for(i=1;i<=n;i++)
		if(stan[i]==val)
			s[++s[0]]=i,pus[i]=1;
	if(stan[1]!=val && stan[1]<val)
		s[++s[0]]=1,pus[1]=1;
}