Cod sursa(job #2418350)

Utilizator lucametehauDart Monkey lucametehau Data 4 mai 2019 17:53:39
Problema Salvare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin ("salvare.in");
ofstream cout ("salvare.out");

int n, k;
int x, y;
int cnt;

vector <int> g[1005];
bool viz[1005];
int dp[1005];

void dfs(int nod, int t, int val) {
  int mn = 1000000;
  dp[nod] = 0;
  for(auto i : g[nod]) {
    if(i == t)
      continue;
    dfs(i, nod, val);
    dp[nod] = max(dp[nod], dp[i] + 1);
    mn = min(mn, dp[i] + 1);
  }
  if(dp[nod] == val) {
    cnt++;
    dp[nod] = -(val + 1);
    viz[nod] = 1;
    return;
  }
  if(mn < 0 && -(mn + 1) >= dp[nod])
    dp[nod] = mn;
}

int main() {
  cin >> n >> k;
  for(int i = 1; i < n; i++) {
    cin >> x >> y;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  int st = 1, dr = 2 * n, mid;
  while(st <= dr) {
    mid = (st + dr) >> 1;
    dfs(1, 0, mid);
    if(dp[1] >= 0)
      cnt++, viz[1] = 1;
    if(cnt <= k)
      dr = mid - 1;
    else
      st = mid + 1;
    cnt = 0;
  }
  cout << st << "\n";
  for(int i = 1; i <= n; i++)
    viz[i] = 0;
  dfs(1, 0, st);
  if(dp[1] >= 0)
    cnt++, viz[1] = 1;
  cnt = k - cnt;
  for(int i = 1; i <= n; i++) {
    if(viz[i])
      cout << i << " ";
    else if(cnt)
      cout << i << " ", cnt--;
  }
  return 0;
}