제출 #586366

#제출 시각아이디문제언어결과실행 시간메모리
586366MilosMilutinovicTorrent (COI16_torrent)C++14
100 / 100
501 ms29424 KiB
/** * author: wxhtzdy * created: 30.06.2022 09:34:28 **/ #include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, a, b; cin >> n >> a >> b; --a; --b; vector<vector<int>> g(n); for (int i = 0; i < n - 1; i++) { int u, v; cin >> u >> v; --u; --v; g[u].push_back(v); g[v].push_back(u); } vector<int> par(n); function<void(int, int)> Dfs = [&](int v, int pr) { par[v] = pr; for (int u : g[v]) { if (u != pr) { Dfs(u, v); } } }; Dfs(a, a); vector<int> path; int x = b; while (x != a) { path.push_back(x); x = par[x]; } pair<int, int> f; vector<int> dp(n); Dfs = [&](int v, int pr) { vector<int> ch; for (int u : g[v]) { if (u == pr || make_pair(u, v) == f || make_pair(v, u) == f) { continue; } Dfs(u, v); ch.push_back(u); } dp[v] = 0; sort(ch.begin(), ch.end(), [&](int i, int j) { return dp[i] > dp[j]; }); for (int i = 0; i < (int) ch.size(); i++) { dp[v] = max(dp[v], dp[ch[i]] + i + 1); } }; auto Solve = [&](int root, int id) { f = make_pair(path[id], par[path[id]]); Dfs(root, root); return dp[root]; }; int sz = (int) path.size(); int low = 0, high = sz - 1; while (low < high) { int mid = (low + high) >> 1; if (Solve(a, mid) <= Solve(b, mid)) { high = mid; } else { low = mid + 1; } } int ans = 1e9; for (int i = -1; i <= 1; i++) { if (low + i >= 0 && low + i < sz) { ans = min(ans, max(Solve(a, low + i), Solve(b, low + i))); } } cout << ans << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...