Advertisement
mickypinata

IPST58: Bypass

Nov 22nd, 2021
630
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.44 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long lli;
  5. typedef pair<int, int> pii;
  6. typedef tuple<int, int, int> tiii;
  7.  
  8. const int N = 1e5 + 5;
  9.  
  10. vector<pii> edges;
  11. vector<int> adj[N];
  12. int subTree[N], par[N];
  13. tiii mx[N];
  14.  
  15. void DFS(int u, int p){
  16.     par[u] = p;
  17.     int cnt = 1;
  18.     int idx = 0;
  19.     int fMx = 0;
  20.     int sMx = 0;
  21.     for(int v : adj[u]){
  22.         if(v == p){
  23.             continue;
  24.         }
  25.         DFS(v, u);
  26.         cnt += subTree[v];
  27.         if(subTree[v] > fMx){
  28.             sMx = fMx;
  29.             fMx = subTree[v];
  30.             idx = v;
  31.         } else if(subTree[v] > sMx){
  32.             sMx = subTree[v];
  33.         }
  34.     }
  35.     mx[u] = tiii(fMx, idx, sMx);
  36.     subTree[u] = cnt;
  37. }
  38.  
  39. int main(){
  40.  
  41.     int nVertex;
  42.     scanf("%d", &nVertex);
  43.     for(int i = 1; i < nVertex; ++i){
  44.         int u, v;
  45.         scanf("%d%d", &u, &v);
  46.         adj[u].push_back(v);
  47.         adj[v].push_back(u);
  48.         edges.emplace_back(u, v);
  49.     }
  50.     DFS(1, 0);
  51.     lli ans = 0;
  52.     for(pii e : edges){
  53.         int u = e.first;
  54.         int v = e.second;
  55.         int mxU = par[u] == v ? 0 : nVertex - subTree[u];
  56.         mxU = max(mxU, get<1>(mx[u]) == v ? get<2>(mx[u]) : get<0>(mx[u]));
  57.         int mxV = par[v] == u ? 0 : nVertex - subTree[v];
  58.         mxV = max(mxV, get<1>(mx[v]) == u ? get<2>(mx[v]) : get<0>(mx[v]));
  59.         ans = max(ans, (lli)mxU * mxV);
  60.     }
  61.     cout << ans;
  62.  
  63.     return 0;
  64. }
  65.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement