Advertisement
erek1e

POI Task Parade

May 7th, 2023
876
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.09 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int INF = 1e9;
  6.  
  7. pair<int, int> dfs(int v, const vector<vector<int>> &g, int parent = 0) {
  8.     int maxFC = -INF, maxEGU = -INF, maxEGU2 = -INF;
  9.     for (int u : g[v]) {
  10.         if (u != parent) {
  11.             auto [fc, egu] = dfs(u, g, v);
  12.             maxFC = max(maxFC, fc);
  13.             if (egu > maxEGU2) {
  14.                 maxEGU2 = egu;
  15.                 if (maxEGU2 > maxEGU) swap(maxEGU, maxEGU2);
  16.             }
  17.         }
  18.     }
  19.  
  20.     int degreeIncludingParent = (int)g[v].size();
  21.     int degreeExcludingParent = (int)g[v].size() - !!parent;
  22.     int fullyContained = max({maxFC, degreeIncludingParent-1+maxEGU, degreeIncludingParent-2+maxEGU+maxEGU2});
  23.     int edgeGoingUp = max({degreeExcludingParent, degreeExcludingParent-1+maxEGU});
  24.     return {fullyContained, edgeGoingUp};
  25. }
  26.  
  27. int main() {
  28.     int n; cin >> n;
  29.     vector<vector<int>> g(1+n);
  30.     for (int i = 1; i < n; ++i) {
  31.         int u, v; cin >> u >> v;
  32.         g[u].push_back(v);
  33.         g[v].push_back(u);
  34.     }
  35.     cout << dfs(1, g).first << endl;
  36.     return 0;
  37. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement