Cod sursa(job #913295)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 13 martie 2013 11:25:04
Problema Salvare Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
 
using namespace std;
 
ifstream in ("salvare.in");
ofstream out ("salvare.out");
 
const int N = 1001;
 
int n,k,L[11][N],SOL,log[N];
vector<int> G[N],V,SP;
pair<int,int> ND[N];
 
void READ ()
{
 
    in>>n>>k;
 
    for( int x,y,i=1 ; i < n ; ++i )
    {
        in>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
 
}
 
int T (int nod,int D)
{
    for( int i=log[n] ; i >= 0 ; --i )
        if( (1<<i) <= D )
        {
            D-=(1<<i);
            nod=L[i][nod];
        }
    return nod;
}
 
void DF (int nod,int D)
{
 
    if( !D )
        return;
 
    V[nod]=D;
 
    for( vector<int>::iterator it=G[nod].begin() ; it < G[nod].end() ; ++it )
        if( D > V[*it]+1 )
            DF ( *it , D-1 );
 
}
 
bool OK (int D)
{
 
    V.assign(n+1,0);
    vector<int> S;
 
    for( int i=1 ; i <= n ; ++i )
    {
 
        if( !V[ND[i].second] )
        {
            int LC=T(ND[i].second,D);
            S.push_back(LC);
            DF(LC,D+1);
        }
 
        if( S.size() > k )
            return 0;
 
    }
 
    SP=S;
 
    return 1;
 
}
 
void SEARCH (int ft,int bk)
{
 
    if( ft == bk )
    {
        if( ft < SOL && OK(ft) )
            SOL=ft;
        return;
    }
 
    int mid=(ft+bk)>>1;
 
    if( OK(mid) )
    {
        SOL=mid;
        SEARCH ( ft , mid-1 );
        return ;
    }
 
    SEARCH ( mid+1  , bk );
 
 
}
 
void SOLVE ()
{
	
	sort( ND+1 , ND+n+1 );
 
    for( int i=2 ; i <= n ; ++i )
        log[i]=log[i>>1]+1;
 
    for( int i=1 ; i <= log[n] ; ++i )
        for( int j=1 ; j <=n ; ++j )
            L[i][j]=L[i-1][j];
 
    SEARCH ( 0 , n/k+1 );
 
    sort( SP.begin() , SP.end() );
 
}
 
void PRINT ()
{
 
    out<<SOL<<'\n';
 
    for( vector<int>::iterator it=SP.begin() ; it < SP.end() ; ++it )
        out<<*it<<' ';
 
}
 
void DFS (int nod,int T)
{
	
	ND[nod]=make_pair(ND[T].first+1,nod);
	
	L[0][nod]=T;
	
	for( vector<int>::iterator it=G[nod].begin() ; it < G[nod].end() ; ++it )
		if( *it != T )
			DFS (*it,nod);
	
}
 
int main ()
{
 
    READ ();
    DFS ( 1 , 1 );
    SOLVE ();
    PRINT ();
 
    return 0;
 
}