Cod sursa(job #1472878)

Utilizator akaprosAna Kapros akapros Data 17 august 2015 23:05:00
Problema Salvare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#define maxN 1002
#define inf 1000000000
using namespace std;
int n, nr, i, j, k, maxd, d[maxN];
bool vis[maxN], hc[maxN], Hc[maxN];
vector < int > V[maxN];

void read()
{
    int x, y;
    freopen("salvare.in", "r", stdin);
    scanf("%d %d", &n, &k);
    for (i = 1; i < n; ++ i)
    {
        scanf("%d %d", &x, &y);
        V[x].push_back(y);
        V[y].push_back(x);
    }
}
void dfs(int x)
{
    int i, minv = inf, sons = 0;
    vis[x] = 1;
    d[x] = - inf;

    for (i = 0; i < V[x].size(); ++ i)
        if (!vis[V[x][i]])
        {
            ++ sons;
            dfs(V[x][i]);
            minv = min(minv, d[V[x][i]] + 1);
            if (!hc[x] && d[V[x][i]] + 1 >= maxd)
            {
                d[x] = - (maxd + 1);
                hc[x] = 1;
                ++ nr;
            }
            else
                if (!hc[x])
                    d[x] = max(d[x], d[V[x][i]] + 1);
        }
    if (!hc[x] && d[x] + minv + 1 <= 0)
        d[x] = minv;
    if (!sons)
       d[x] = 0;
}
int ok(int x)
{
    maxd = x;
    memset(vis, 0, sizeof(vis));
    memset(hc, 0, sizeof(hc));
    memset(d, 0, sizeof(d));
    nr = 0;
    dfs(1);
    if (d[1] >= 0)
    {
        hc[1] = 1;
        ++ nr;
    }
    return nr <= k;
}
int bs()
{
    int i = n, p = 1 << 9;
    while (p)
    {
        if (i - p > 0 && ok(i - p))
        {
            i -= p;
            memcpy(Hc, hc, sizeof(hc));
        }
        p /= 2;
    }
    return i;
}
void write()
{
    int nr;
    freopen("salvare.out", "w", stdout);
    printf("%d\n", bs());
    i = 1;
    while (nr < k && i <= n)
    {
        if (!Hc[i])
        {
            Hc[i] = 1;
            ++ nr;
        }
        ++ i;
    }
    for (i = 1; i <= n; ++ i)
        if (Hc[i])
           printf("%d ", i);
}
int main()
{
    read();
    write();
}