Cod sursa(job #2390354)

Utilizator osiaccrCristian Osiac osiaccr Data 27 martie 2019 22:53:32
Problema Salvare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <bits/stdc++.h>
#define DEF 1010
#define INF 1 << 29

using namespace std;

ifstream fin ("salvare.in");
ofstream fout ("salvare.out");

vector < int > L[DEF], Sol;

int n, m, k, maxDist, nr;

int Dist[DEF], Fr[DEF];

deque < int > Q;

bitset < DEF > Viz;

void dfs (int nod, int tata) {

    int minim = INF;

    for (auto it : L[nod]) {

        if (it != tata) {

            dfs (it, nod);

                Dist[nod] = max (Dist[nod], Dist[it] + 1);
            minim = min (minim, Dist[it] + 1);

        }

    }

    if (Dist[nod] == maxDist) {
        ++ nr;
        Sol.push_back (nod);
        Dist[nod] = -maxDist - 1;
        return;
    }

    if (minim < 0 and -minim - 1 >= Dist[nod]) {
        Dist[nod] = minim;
    }

}

bool verif (int d) {

    maxDist = d, nr = 0;

    Sol.clear ();

    fill (Dist + 1, Dist + n + 1, 0);

    dfs (1, 0);

    if (Dist[1] >= 0) {
        ++ nr;
        Sol.push_back (1);
    }

    return (nr <= k);

}

int main () {

    fin >> n >> k;

    for (int i = 1; i <= n - 1; ++ i) {
        int x, y;
        fin >> x >> y;
        L[x].push_back (y);
        L[y].push_back (x);
    }

    int st = 1, dr = n, mid = (st + dr) / 2, ans;
    while (st <= dr) {
        if (verif (mid)) {
            ans = mid;
            dr = mid - 1;
        }
        else {
            st = mid + 1;
        }
        mid = (st + dr) / 2;
    }

    fout << ans << "\n";

    verif (ans);

    for (auto it : Sol) {
        Fr[it] = 1;
    }

    for (int i = 1; i <= n; ++ i) {
        if (Fr[i] == 0 and Sol.size () < k) {
            Sol.push_back (i);
        }
    }

    sort (Sol.begin (), Sol.end ());

    for (auto it : Sol)
        fout << it << ' ';

    return 0;
}