Advertisement
erek1e

IOI '10 P6 - Traffic Congestion (Standard I/O)

Jul 11th, 2023
923
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.03 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. const int INF = 2e9 + 1e8;
  7.  
  8. vector<vector<int>> g;
  9. vector<int> p, subtree, par;
  10. int dfs(int node, int parent = -1) {
  11.     par[node] = parent;
  12.     subtree[node] = p[node];
  13.     for (int child : g[node]) {
  14.         if (child != parent) subtree[node] += dfs(child, node);
  15.     }
  16.     return subtree[node];
  17. }
  18.  
  19. int main() {
  20.     int n; cin >> n;
  21.     p.resize(n);
  22.     for (int &x : p) cin >> x;
  23.     g.resize(n);
  24.     for (int i = 1; i < n; ++i) {
  25.         int u, v; cin >> u >> v;
  26.         g[u].push_back(v);
  27.         g[v].push_back(u);
  28.     }
  29.     subtree.resize(n), par.resize(n);
  30.     int total = dfs(0);
  31.     pair<int, int> best{INF, INF};
  32.     for (int i = 0; i < n; ++i) {
  33.         int maxEdge = 0;
  34.         for (int child : g[i]) {
  35.             if (child == par[i]) maxEdge = max(maxEdge, total-subtree[i]);
  36.             else maxEdge = max(maxEdge, subtree[child]);
  37.         }
  38.         best = min(best, {maxEdge, i});
  39.     }
  40.     cout << best.second << endl;
  41.     return 0;
  42. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement