Advertisement
Alex_tz307

USACO 2015 December Contest, Platinum Problem 1. Max Flow

Jun 1st, 2021
967
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. ifstream fin("maxflow.in");
  6. ofstream fout("maxflow.out");
  7.  
  8. const int MAXN = 5e4 + 1;
  9. const int MAXM = MAXN << 1;
  10. const int LGMAX = 17;
  11. vector<int> G[MAXN];
  12. int M, p[MAXN], tour[MAXM], first[MAXN], depth[MAXN], lg2[MAXM], rmq[MAXM][LGMAX], dp[MAXN], ans;
  13.  
  14. void max_self(int &x, int y) {
  15.   x = max(x, y);
  16. }
  17.  
  18. void dfs1(int u, int parent) {
  19.   p[u] = parent;
  20.   tour[++M] = u;
  21.   first[u] = M;
  22.   for (int v : G[u])
  23.     if (v != parent) {
  24.       depth[v] = depth[u] + 1;
  25.       dfs1(v, u);
  26.       tour[++M] = u;
  27.     }
  28. }
  29.  
  30. void compute_rmq() {
  31.   for (int i = 1; i <= M; ++i) {
  32.     rmq[i][0] = tour[i];
  33.     if (i > 1)
  34.       lg2[i] = lg2[i >> 1] + 1;
  35.   }
  36.   for (int j = 1; (1 << j) <= M; ++j)
  37.     for (int i = 1; i + (1 << j) - 1 <= M; ++i) {
  38.       int l = 1 << (j - 1);
  39.       int u = rmq[i][j - 1], v = rmq[i + l][j - 1];
  40.       if (depth[u] < depth[v])
  41.         rmq[i][j] = u;
  42.       else rmq[i][j] = v;
  43.     }
  44. }
  45.  
  46. int find_lca(int x, int y) {
  47.   int l = first[x], r = first[y];
  48.   if (l > r)
  49.     swap(l, r);
  50.   int diff = r - l + 1;
  51.   int k = lg2[diff];
  52.   int shift = diff - (1 << k);
  53.   int u = rmq[l][k], v = rmq[l + shift][k];
  54.   if (depth[u] < depth[v])
  55.     return u;
  56.   return v;
  57. }
  58.  
  59. void dfs2(int u) {
  60.   for (int v : G[u])
  61.     if (v != p[u]) {
  62.       dfs2(v);
  63.       dp[u] += dp[v];
  64.     }
  65.   max_self(ans, dp[u]);
  66. }
  67.  
  68. int main() {
  69.   int n, m;
  70.   fin >> n >> m;
  71.   for (int i = 1; i < n; ++i) {
  72.     int u, v;
  73.     fin >> u >> v;
  74.     G[u].emplace_back(v);
  75.     G[v].emplace_back(u);
  76.   }
  77.   dfs1(1, 0);
  78.   compute_rmq();
  79.   for (int i = 0; i < m; ++i) {
  80.     int u, v;
  81.     fin >> u >> v;
  82.     int lca = find_lca(u, v);
  83.     ++dp[u], ++dp[v], --dp[lca], --dp[p[lca]];
  84.   }
  85.   dfs2(1);
  86.   fout << ans << '\n';
  87.   fin.close();
  88.   fout.close();
  89.   return 0;
  90. }
  91.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement