Cod sursa(job #2841616)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 29 ianuarie 2022 23:26:41
Problema Salvare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 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 N, depth[1 + kN], sol[1 + kN];
bitset<1 + kN> mark;

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

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

void dfs(int u, int par, int radius) {
  int mx = 0, mn = INF;
  for (int v : g[u]) {
    if (v != par) {
      dfs(v, u, radius);
      maxSelf(mx, depth[v] + 1);
      minSelf(mn, depth[v] + 1);
    }
  }
  depth[u] = mx;
  if (depth[u] == radius) {
    sol[++N] = u;
    depth[u] = -radius - 1;
  } else if (mn < 0 && depth[u] < -mn) {
    depth[u] = mn;
  }
}

bool check(int m, int k) {
  N = 0;
  dfs(1, 0, m);
  if (depth[1] > 0) {
    sol[++N] = 1;
  }
  return N <= k;
}

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 step = 1;
  while (step * 2 <= n - 1) {
    step *= 2;
  }
  int ans = 0;
  while (step) {
    if (!check(ans | step, k)) {
      ans |= step;
    }
    step /= 2;
  }
  ans += 1;
  check(ans, k);
  fout << ans << '\n';
  for (int i = 1; i <= N; ++i) {
    mark[sol[i]] = true;
  }
  for (int v = 1; v <= n && N < k; ++v) {
    if (!mark[v]) {
      sol[++N] = v;
    }
  }
  sort(sol + 1, sol + k + 1);
  for (int i = 1; i <= k; ++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;
}