Cod sursa(job #675796)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 8 februarie 2012 11:22:11
Problema Salvare Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include<stdio.h>
#include<vector>

#define maxn 1005
#define INF (1<<29)

using namespace std;

FILE*f=fopen("salvare.in","r");
FILE*g=fopen("salvare.out","w");

int n,k,nec,i;
int rem[maxn],used[maxn],closest[maxn];
vector<int>G[maxn],sol;

void dfs ( int nod , int t , int d ){
	
	for ( vector<int>::iterator itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){
		int nodvcn = (*itt);
		if ( nodvcn != t ){
			dfs(nodvcn,nod,d);
		}
	}
	
	rem[nod] = d; closest[nod] = INF;
	for ( vector<int>::iterator itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){
		int nodvcn = (*itt);
		if ( nodvcn != t ){
			if ( closest[nodvcn] + 1 < closest[nod] )
				closest[nod] = closest[nodvcn] + 1;
			if ( rem[nodvcn] - 1 < rem[nod] ){
				rem[nod] = rem[nodvcn] - 1;
			}
		}
	}
	
	if ( closest[nod] - (rem[nod] == d) <= rem[nod] ){
		rem[nod] = INF;
	}
	
	if ( !rem[nod] || (nod == 1 && closest[nod] > rem[nod]) ){
		++nec;
		used[nod] = 1;
		closest[nod] = 0; rem[nod] = INF;
	}		
}

inline int cauta () {
	int p,m,u; p = 1; u = n;
	
	while ( p <= u ){
		m = (p + u) >> 1;
		
		for ( int i = 1 ; i <= n ; ++i ){
			used[i] = 0;
		}
		nec = 0;
		
		dfs(1,0,m);
		
		if ( nec <= k ){
			sol.clear();
			for ( int i = 1 ; i <= n ; ++i ){
				if ( used[i] ){
					sol.push_back(i);
				}
				else{
					if ( nec < k ){
						++nec; sol.push_back(i);
					}
				}
			}
			
			u = m - 1;
		}
		else{
			p = m + 1;
		}
	}
	
	return p;
}

int main () {
	
	fscanf(f,"%d %d",&n,&k);
	
	int x,y;
	for ( i = 1 ; i < n ; ++i ){
		fscanf(f,"%d %d",&x,&y);
		G[x].push_back(y);
		G[y].push_back(x);
	}
	
	fprintf(g,"%d\n",cauta());
	for ( i = 0 ; i < k ; ++i ){
		fprintf(g,"%d ",sol[i]);
	}
	fprintf(g,"\n");
	
	fclose(f);
	fclose(g);
	
	return 0;
}