Cod sursa(job #991489)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 30 august 2013 16:33:32
Problema Salvare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>
 
#define MAX 1005
#define LMAX 11
#define pb push_back
 
using namespace std;
 
int N, V[MAX], K, lvl[MAX], a, b, sol, TT[LMAX][MAX], log[MAX], maxim;
int marked[MAX];
vector<int> v[MAX], part, vSol;
 
void dfs(int nod, int dad)
{
    lvl[nod] = lvl[dad] + 1; TT[0][nod] = dad;
    for(size_t i = 0; i < v[nod].size(); i++)
    {
        if(v[nod][i] == dad) continue;
        dfs(v[nod][i], nod);
    }
}
 
bool cmp(int a, int b)
{
    return lvl[a] > lvl[b];
}
 
void mark(int nod, int dist)
{
    if(!dist) return;
    marked[nod] = dist;
    for(size_t i = 0; i < v[nod].size(); i++)
    {
        if(dist - 1 > marked[v[nod][i]])
            mark(v[nod][i], dist - 1);
    }
}
 
int nth_dad(int nod, int src)
{
    for(int i = 0; i < LMAX && nod; i++)
        if((1 << i) & src)
            nod = TT[i][nod];
    return (nod ? nod : 1);
}
 
bool ok(int dist)
{
    memset(marked, 0, sizeof(marked));
    part.clear();
    for(int i = 1; i <= N; i++)
        if(!marked[V[i]])
        {
            int start = nth_dad(V[i], dist);
            part.pb(start);
            if(part.size() > K) return false;
            mark(start, dist + 1);
        }
    return true;
}
 
void buildDads()
{
    for(int i = 1; i <= log[N]; i++)
        for(int j = 1; j <= N; j++)
            TT[i][j] = TT[i - 1][TT[i - 1][j]];
}
 
void citire()
{
    ifstream in("salvare.in"); in>>N>>K;
    for(int i = 1; i < N; i++)
    {
        in>>a>>b;
        v[a].pb(b);
        v[b].pb(a);
    } in.close();
}
 
void afisare()
{
    memset(marked, 0, sizeof(marked));
    for(size_t i = 0; i < vSol.size(); i++) marked[vSol[i]] = 1;
    for(int i = 1, k = K - vSol.size(); k; i++) if(!marked[i]) vSol.pb(i), k--;
    sort(vSol.begin(), vSol.end());
    ofstream out("salvare.out"); out<<sol<<"\n";
    for(size_t i = 0; i < vSol.size(); i++) out<<vSol[i]<<" ";
    out.close();
}
 
void preprocess()
{
    dfs(1, 0);
    for(int i = 1; i <= N; i++) V[i] = i, log[i] = log[i >> 1] + 1;
    sort(V + 1, V + N + 1, cmp);
    buildDads();
}
 
void solve()
{
    int L = 0, R = N / K + 1;
    while(L <= R)
    {
        int mid = (L + R) >> 1;
        if(ok(mid))
        {
            sol = mid;
            vSol = part;
            R = mid - 1;
        }
        else
            L = mid + 1;
    }
}
 
int main()
{
    citire();
    preprocess();
    solve();
    afisare();
    return 0;
}