Cod sursa(job #940453)

Utilizator rudarelLup Ionut rudarel Data 16 aprilie 2013 11:34:56
Problema Salvare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <algorithm>
#include <stdio.h>
#include <vector>
 
#define MAX 1024
#define pb push_back
 
using namespace std;
 
int n, k, minM, puse;
vector <int> vctDrum[MAX];
int sel[MAX], calc[MAX], pus[MAX];
 
inline void test(int x, int lim)
{
    int valMin = n, valMax = 0;
    sel[x] = 1;
 
    for (int i = 0; i < vctDrum[x].size(); i++)
        if (!sel[vctDrum[x][i]])
        {
            test(vctDrum[x][i], lim);
 
            valMax = max(valMax, calc[vctDrum[x][i]] + 1);
            valMin = min(valMin, calc[vctDrum[x][i]] + 1);
        }
 
    if (valMin + valMax <= 2 * lim + 1)
        calc[x] = valMin;
    else calc[x] = valMax;
    if (calc[x] > 2 * lim)
        calc[x] = 0;
 
    if (valMin == n)
        calc[x] = lim + 1;
}
 
inline void cautaBin(int fr, int ls)
{
    if (fr > ls)
        return;
    int med = (fr + ls) / 2;
 
    memset(calc, 0, sizeof(calc));
    memset(sel, 0, sizeof(sel));
    test(1, med);
 
    int lt = 0;
    if (calc[1] > med || n == 1)
        calc[1] = 0;
    for (int i = 1; i <= n; i++)
        lt += (!calc[i])? 1 : 0;
    if (lt <= k)
    {
        minM = med;
        puse = lt;
 
        for (int i = 1; i <= n; i++)
            pus[i] = (!calc[i])? 1 : 0;
 
        cautaBin(fr, med - 1);
    }
    else cautaBin(med + 1, ls);
}
 
int main()
{
    freopen("salvare.in", "r", stdin);
    freopen("salvare.out", "w", stdout);
 
    scanf("%d %d", &n, &k);
 
    for (int i = 1; i < n; i++)
    {
        int nod1, nod2;
        scanf("%d %d", &nod1, &nod2);
 
        vctDrum[nod1].pb(nod2);
        vctDrum[nod2].pb(nod1);
    }
     
    cautaBin(0, n);
 
    vector <int> vctSol;
    int dp = k - puse;
    for (int i = 1; i <= n; i++)
    {
        dp += pus[i];
     
        if (dp)
        {
            vctSol.pb(i);
 
            dp--;
        }
    }
 
    sort(vctSol.begin(), vctSol.end());
 
    printf("%d\n", minM);
    for (int i = 0; i < vctSol.size(); i++)
        printf("%d ", vctSol[i]);
 
    fclose(stdin);
    fclose(stdout);
    return 0;
}