Cod sursa(job #217625)

Utilizator Data 29 octombrie 2008 10:20:47
Problema Salvare Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
using namespace std;
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <queue>
#define pb push_back
#define sz size
#define II inline
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define IN "salvare.in"
#define OUT "salvare.out"
#define oo 16843009
#define N_MAX 1<<10
int N,K;typedef vector<int> VI;vector< vector<int> > A(N_MAX);
bool sol[N_MAX],viz[N_MAX];int Di[N_MAX],D[N_MAX],H[N_MAX],T[N_MAX],F[N_MAX];struct Comp{bool operator () (int i,int j){return H[i] < H[j];}};priority_queue<int, VI, Comp> stv;
II void scan(){int x,y;freopen(IN,"r",stdin);freopen(OUT,"w",stdout);scanf("%d\n%d\n",&N,&K);FOR(i,1,N-1){scanf("%d %d\n",&x,&y);A[x].pb(y);A[y].pb(x);}}void BF(int nod){viz[nod] = true;int l = A[nod].sz() - 1;FOR(i,0,l)
{int fiu = A[nod][i];if(!viz[fiu]){T[fiu] = nod;H[fiu] = H[nod] + 1;BF(fiu);}}}II int make(int dist){int nr(0);memset(viz,0,sizeof(viz));memset(D,1,sizeof(D));memset(sol,0,sizeof(sol));memset(Di,0,sizeof(D));FOR(i,1,F[0])stv.push(F[i]),D[ F[i] ] = oo,Di[ F[i] ] = 0,viz[ F[i] ] = true;for(int nod;!stv.empty();){nod = stv.top();stv.pop();
int tata = T[nod];viz[nod] = true;if((Di[nod] == dist && D[nod] == oo) || (Di[nod] >= dist*2 && D[nod] != oo) || !tata){D[nod] = Di[nod] = 0;++nr;sol[nod] = true;}if(!tata)continue;if(!viz[tata] && tata){stv.push(tata);D[tata] = min(oo,D[nod]+1);
Di[tata] = Di[nod] + 1;viz[tata] = true;continue;}if(D[nod] != oo && D[tata] != oo){if(D[nod] + 1 + D[tata] <= dist){D[tata] = min(D[tata],D[nod]+1);Di[tata] = min(Di[tata],Di[nod]+1);continue;}Di[tata] = max(Di[tata],Di[nod]+1);continue;}	
if(D[nod] == oo && D[tata] != oo){if(D[tata] + Di[nod]+1 <= dist)continue;}if(D[tata] == oo && D[nod] != oo){if(D[nod] + 1 + Di[tata] <= dist){D[tata] = D[nod] + 1;Di[tata] = max(Di[tata],Di[nod]+1);continue;}}if(D[tata] == oo && D[nod] == oo){Di[tata] = max(Di[tata],Di[nod]+1);
continue;}D[tata] = oo;if(D[nod] == oo)Di[tata] = max(Di[tata],Di[nod] + 1);}return nr;}II void solve(){BF(1);memset(viz,0,sizeof(viz));FOR(i,1,N_MAX)viz[ T[i] ] = true;FOR(i,1,N)if(!viz[i])F[++F[0]] = i;memset(viz,0,sizeof(viz));int m,step;for(step = 1; step <= N; step <<= 1);
for(m = 0; step; step >>= 1)if( m + step <= N && make(m + step - 1) > K)m += step;make(m);	printf("%d\n",m);srand((int)time(0));int nr(0);FOR(i,1,N)if(sol[i] == true)++nr;for(;nr < K;++nr){	int aux;for(aux=rand()%N+1;sol[aux];aux=rand()%N+1);sol[aux] = true;
}FOR(i,1,N)if(sol[i] == true)printf("%d ",i);}int main(){scan();solve();return 0;}