Cod sursa(job #1563148)

Utilizator vladrochianVlad Rochian vladrochian Data 5 ianuarie 2016 18:30:39
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <algorithm>
#include <cstring>
#include <fstream>
#include <vector>

using namespace std;

const int N_MAX = 1000;

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

int N, K, M;
vector<int> G[N_MAX + 5];

int father[N_MAX + 5];
int level[N_MAX + 5];

vector<int> nodes;
bool in_sol[N_MAX + 5];
bool ok[N_MAX + 5];

void DfsBuild(int node) {
   for (int son : G[node])
      if (son != father[node]) {
         father[son] = node;
         level[son] = level[node] + 1;
         DfsBuild(son);
      }
}

void DfsFill(int node, int father, int d) {
   ok[node] = true;
   if (d > 0)
      for (int son : G[node])
         if (son != father)
            DfsFill(son, node, d - 1);
}

int Count(int D) {
   memset(in_sol, 0, sizeof in_sol);
   memset(ok, 0, sizeof ok);
   int cnt = 0;

   for (int node : nodes)
      if (!ok[node]) {
         for (int i = 0; i < D && father[node]; ++i)
            node = father[node];
         in_sol[node] = true;
         ++cnt;
         DfsFill(node, 0, D);
      }

   return cnt;
}

int Search() {
   int l = 0, r = N - 1;
   while (l <= r) {
      int m = (l + r) / 2;
      if (Count(m) > K)
         l = m + 1;
      else
         r = m - 1;
   }
   return l;
}

int main() {
   fin >> N >> K;
   for (int i = 1; i < N; ++i) {
      int x, y;
      fin >> x >> y;
      G[x].push_back(y);
      G[y].push_back(x);
   }

   DfsBuild(1);
   for (int i = 1; i <= N; ++i)
      nodes.push_back(i);
   sort(nodes.begin(), nodes.end(), [](int lhs, int rhs) { return level[lhs] > level[rhs]; });

   M = Search();
   fout << M << "\n";
   K -= Count(M);

   for (int i = 1; i <= N; ++i)
      if (in_sol[i] || K-- > 0)
         fout << i << " ";
   fout << "\n";
   return 0;
}