Cod sursa(job #572012)

Utilizator katakunaCazacu Alexandru katakuna Data 4 aprilie 2011 22:13:36
Problema Salvare Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;

#define Nmax 1010
#define Kmax 510
#define INF (1 << 30)

int n, k, X, K;
int viz[Nmax], Tata[Nmax], A[Nmax], B[Nmax], Ac[Nmax], Sol[Nmax];
vector <int> V[Nmax];

void citire () {

    int i, x, y;

    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 nod) {

    vector <int>::iterator it;

    viz[nod] = 1;
    for (it = V[nod].begin (); it != V[nod].end (); it++)
        if (!viz[*it])
            Tata[*it] = nod, dfs (*it);

    A[nod] = INF;
    for (it = V[nod].begin (); it != V[nod].end (); it++)
        if (*it != Tata[nod] && A[nod] > A[*it] + 1 ) A[nod] = A[*it] + 1;

    B[nod] = 0;
    for (it = V[nod].begin (); it != V[nod].end (); it++)
        if (*it != Tata[nod] && (B[*it] + 1 + A[nod] > X))
            if (B[nod] < B[*it] + 1)
                B[nod] = B[*it] + 1;

    if (B[nod] + A[nod] <= X) {
        B[nod] = 0;
    }

    if (B[nod] == X || (nod == 1 && B[nod] + A[nod] > X)) {
        K++;
        A[nod] = 0;
        B[nod] = 0;
        Ac[++Ac[0]] = nod;
    }
}

int main () {

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

    citire ();

    int p = 1, u = n, mij, sol = 0;
    while (p <= u) {
        mij = (p + u) >> 1;
        X = mij; K = 0; Ac[0] = 0; //X = 4;
        memset (viz, 0, sizeof (viz));
        dfs (1);

        if (K <= k) {
            sol = mij;
            u = mij - 1;
            memcpy (Sol, Ac, sizeof (Ac));
        }
        else
            p = mij + 1;
    }

    printf ("%d\n", sol);

    memset (viz, 0, sizeof (viz));
    int i;
    for (i = 1; i <= n; i++)
        viz[ Sol[i] ] = 1;

    for (i = 1; i <= n && Sol[0] != k; i++)
        if (!viz[i]) Sol[++Sol[0]] = i;

    for (i = 1; i <= k; i++)
        printf ("%d ", Sol[i]);

    return 0;
}