제출 #757825

#제출 시각아이디문제언어결과실행 시간메모리
757825taherTorrent (COI16_torrent)C++17
100 / 100
460 ms30352 KiB
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
#include "C:\GCC\debug.h"
#else
#define debug(...) void(42)
#endif

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, a, b;
  cin >> n >> a >> b;
  --a, --b;

  vector<vector<array<int, 2>>> adj(n);
  for (int i = 0; i < n - 1; i++) {
    int u, v;
    cin >> u >> v;
    --u, --v;
    adj[u].push_back({v, i});
    adj[v].push_back({u, i});
  }

  vector<int> dp(n);

  function<void(int, int, int)> Dfs = [&](int u, int prev, int blocked_edge) {
    dp[u] = 0;
    vector<int> children;
    for (auto v : adj[u]) {
      if (v[0] == prev || v[1] == blocked_edge) {
        continue;
      }

      Dfs(v[0], u, blocked_edge);
      children.push_back(dp[v[0]]);
    }
    sort(children.begin(), children.end());

    for (int i = (int) children.size() - 1; i >= 0; i--) {
      int add = (int) children.size() - i;
      dp[u] = max(dp[u], children[i] + add);
    }
    return ;
  };

  vector<int> edges;

  function<bool(int, int)> Root = [&](int u, int prev) {
    if (u == b) {
      return true;
    }
    bool found = false;

    for (auto v : adj[u]) {
      if (v[0] == prev) {
        continue;
      }

      if (Root(v[0], u)) {
        found = true;
        edges.push_back(v[1]);
      }
    }
    return found;
  };

  Root(a, -1);

  int res = 12345678;
  reverse(edges.begin(), edges.end());

  int low = 0, high = (int) edges.size() - 1;

  while (low <= high) {
    int mid = low + (high - low) / 2;

    Dfs(a, -1, edges[mid]);
    Dfs(b, -1, edges[mid]);

    if (dp[a] <= dp[b]) {
      low = mid + 1;
    } else {
      high = mid - 1;
    }
  }
  --low;

  if (low >= 0) {
    Dfs(a, -1, edges[low]);
    Dfs(b, -1, edges[low]);
    res = min(res, max(dp[a], dp[b]));
  }
  ++low;
  if (low < (int) edges.size()) {
    Dfs(a, -1, edges[low]);
    Dfs(b, -1, edges[low]);
    res = min(res, max(dp[a], dp[b]));
  }
  cout << res << '\n';
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...