Cod sursa(job #2789086)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 26 octombrie 2021 21:00:41
Problema Salvare Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f

using namespace std;

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

const int kN = 1e3;
vector<int> g[1 + kN];
int deg[1 + kN], dp[1 + kN], q[1 + kN], sol[1 + kN];

void min_self(int &x, const int &y) {
  if (y < x) {
    x = y;
  }
}

void TestCase() {
  int n, k;
  fin >> n >> k;
  for (int i = 1; i < n; ++i) {
    int u, v;
    fin >> u >> v;
    g[u].emplace_back(v);
    g[v].emplace_back(u);
  }
  if (n == k) {
    fout << "0\n";
    for (int i = 1; i <= n; ++i) {
      fout << i << ' ';
    }
    fout << '\n';
    return;
  }
  int req;
  auto check = [&](int m) -> bool {
    int st = 0, dr = -1;
    for (int i = 1; i <= n; ++i) {
      deg[i] = g[i].size();
      dp[i] = INF;
      if (deg[i] == 1) {
        dp[i] = m;
        q[++dr] = i;
      }
    }
    req = 0;
    while (st <= dr) {
      int u = q[st++];
      for (int v : g[u]) {
        min_self(dp[v], dp[u]);
        if (--deg[v] == 1) {
          --dp[v];
          if (dp[v] == 0) {
            sol[++req] = v;
            if (k < req) {
              return false;
            }
            dp[v] = m << 1 | 1;
          }
          q[++dr] = v;
        }
      }
    }
    return true;
  };
  int l = 1, r = n - 1, ans = n;
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (check(mid)) {
      ans = mid;
      r = mid - 1;
    } else {
      l = mid + 1;
    }
  }
  check(ans);
  fout << ans << '\n';
  for (int i = 1; i <= req; ++i) {
    fout << sol[i] << ' ';
  }
  fout << '\n';
}

int main() {
  int tests = 1;
  for (int tc = 1; tc <= tests; ++tc) {
    TestCase();
  }
  fin.close();
  fout.close();
  return 0;
}