DuongNhi99

LUBENICA (vnoj) - LCA (Độ dài con đường ngắn nhất, dài nhất giữa 2 đỉnh)

Jan 18th, 2022
983
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.46 KB | None | 0 0
  1. // https://oj.vnoi.info/problem/lubenica
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. using ll = long long;
  6. using pi32 = pair<int, int>;
  7.  
  8. const int N = 1e5 + 5;
  9. const int M = log2(N) + 1;
  10. const int INF = 1e9 + 7;
  11.  
  12. struct Data {
  13.     int par, minc = INF, maxc = -INF;
  14. };
  15.  
  16. int n, l;
  17. vector<pi32> graph[N];
  18.  
  19. int height[N];
  20. Data up[N][M];
  21.  
  22. void DFS(int u, int p) {
  23.     up[u][0].par = p;
  24.  
  25.     for (auto &e : graph[u]) {
  26.         int v = e.first;
  27.         int uv = e.second;
  28.  
  29.         if (v == p) continue;
  30.  
  31.         height[v] = height[u] + 1;
  32.         up[v][0].maxc = up[v][0].minc = uv;
  33.         DFS(v, u);
  34.     }
  35. }
  36.  
  37. void buildLCA() {
  38.     l = log2(n);
  39.  
  40.     DFS(1, 1);
  41.     for (int i = 1; i <= l; i++) {
  42.         for (int u = 1; u <= n; u++) {
  43.             up[u][i].par = up[up[u][i - 1].par][i - 1].par;
  44.             up[u][i].maxc = max(up[u][i - 1].maxc, up[up[u][i - 1].par][i - 1].maxc);
  45.             up[u][i].minc = min(up[u][i - 1].minc, up[up[u][i - 1].par][i - 1].minc);
  46.         }
  47.     }
  48. }
  49.  
  50. void solve(int u, int v) {
  51.     Data res;
  52.     if (height[u] < height[v]) swap(u, v);
  53.     for (int i = l; i >= 0; i--) {
  54.         if(height[u] - (1 << i) >= height[v]) {
  55.             res.maxc = max(res.maxc, up[u][i].maxc);
  56.             res.minc = min(res.minc, up[u][i].minc);
  57.             u = up[u][i].par;
  58.         }
  59.     }
  60.  
  61.     if (u == v) {
  62.         cout << res.minc << ' ' << res.maxc << '\n';
  63.         return;
  64.     }
  65.  
  66.     for (int i = l; i >= 0; --i) {
  67.         if (up[u][i].par != up[v][i].par) {
  68.             res.maxc = max({res.maxc, up[u][i].maxc, up[v][i].maxc});
  69.             res.minc = min({res.minc, up[u][i].minc, up[v][i].minc});
  70.             u = up[u][i].par; v = up[v][i].par;
  71.         }
  72.     }
  73.  
  74.     res.maxc = max({res.maxc, up[u][0].maxc, up[v][0].maxc});
  75.     res.minc = min({res.minc, up[u][0].minc, up[v][0].minc});
  76.  
  77.     cout << res.minc << ' ' << res.maxc << '\n';
  78. }
  79.  
  80. int main() {
  81. #ifdef LOCAL
  82.     freopen("in.txt", "r", stdin);
  83. #else
  84.     freopen("LUBENICA.inp", "r", stdin);
  85.     freopen("LUBENICA.out", "w", stdout);
  86. #endif
  87.     ios_base::sync_with_stdio(false);
  88.     cin.tie(nullptr);
  89.  
  90.     cin >> n;
  91.     for (int i = 1; i <= n - 1; ++i) {
  92.         int u, v, w; cin >> u >> v >> w;
  93.         graph[u].push_back({v, w});
  94.         graph[v].push_back({u, w});
  95.     }
  96.  
  97.     buildLCA();
  98.  
  99.     int nTest; cin >> nTest;
  100.     while (nTest--) {
  101.         int u, v; cin >> u >> v;
  102.         solve(u, v);
  103.     }
  104.  
  105.     return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment