Cod sursa(job #1348163)

Utilizator geniucosOncescu Costin geniucos Data 19 februarie 2015 15:47:51
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.7 kb
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

int K, ap[1009];

class tree
{
public:
    int N;

    void add_edge (int x, int y)
    {
        edges[x].push_back (y);
        edges[y].push_back (x);
    }

    void init ()
    {
        T[1] = -1;
        dfs (1);

        for (int i=1; i<=N; i++)
            ordine[i].first = -niv[i], ordine[i].second = i;
        sort (ordine + 1, ordine + N + 1);
    }

    vector < int > answer (int K)
    {
        vector < int > ans;
        init_dp (K);

        for (int i=1; i<=N; i++)
        if (dp[ordine[i].second] > K)
        {
            int special_node;

            special_node = ordine[i].second;
            for (int j=1; j<=K; j++)
            {
                if (special_node == 1)
                    break;
                special_node = T[special_node];
            }

            dp[special_node] = 0;
            refresh (special_node);
            ans.push_back (special_node);
        }

        return ans;
    }

private:
    vector < int > edges[1009];
    pair < int , int > ordine[1009];
    int niv[1009], dp[1009], T[1009];

    void dfs (int nod)
    {
        for (vector < int > :: iterator it = edges[nod].begin(); it != edges[nod].end(); it ++)
            if (T[*it] == 0)
            {
                T[*it] = nod;
                niv[*it] = niv[nod] + 1;
                dfs (*it);
            }
    }

    void init_dp (int K)
    {
        for (int i=1; i<=N; i++)
            dp[i] = K + 3;
    }

    void refresh (int nod)
    {
        for (vector < int > :: iterator it = edges[nod].begin(); it != edges[nod].end(); it ++)
            if (dp[nod] + 1 < dp[*it])
            {
                dp[*it] = dp[nod] + 1;
                refresh (*it);
            }
    }
}arb;

bool ok (int max_dist)
{
    vector < int > curr_ans = arb.answer (max_dist);
    return (curr_ans.size() <= K);
}

int main()
{
freopen ("salvare.in", "r", stdin);
freopen ("salvare.out", "w", stdout);

scanf ("%d %d", &arb.N, &K);
for (int i=1; i<arb.N; i++)
{
    int x, y;
    scanf ("%d %d", &x, &y);
    arb.add_edge (x, y);
}
arb.init();

int p, u, mij, ras;
p = 1;
u = arb.N;
while (p <= u)
{
    mij = (p + u) >> 1;
    if (ok (mij))
        ras = mij, u = mij - 1;
    else
        p = mij + 1;
}

vector < int > ans = arb.answer (ras);

for (vector < int > :: iterator it = ans.begin(); it != ans.end(); it ++)
    ap[*it] = 1, K --;

for (int i=1; i<=arb.N; i++)
    if (K && ap[i] == 0)
        K --, ap[i] = 1;

printf ("%d\n", ras);
for (int i=1; i<=arb.N; i++)
    if (ap[i])
        printf ("%d ", i);

return 0;
}