4eyes4u

Center in a tree

Feb 16th, 2017
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.02 KB | None | 0 0
  1. /*
  2. Finding center in a tree
  3.  
  4. additional check is needed because sub-star graph
  5.  
  6. Complexity: O(n)
  7. */
  8.  
  9. #include <bits/stdc++.h>
  10. using namespace std;
  11.  
  12. const int N=1e5+10;
  13.  
  14. vector<int> g[N];
  15. int dist[N], n;
  16. bool path[N];
  17.  
  18. pair<int, int> dfs (int v, int prev)
  19. {
  20.     dist[v]=dist[prev]+1;
  21.     pair<int, int> ret={dist[v], v};
  22.  
  23.     for (auto xt: g[v])
  24.     {
  25.         if (xt==prev) continue;
  26.         ret=max(ret, dfs(xt, v));
  27.     }
  28.  
  29.     return ret;
  30. }
  31.  
  32. void makePath (int v)
  33. {
  34.     path[v]=true;
  35.     for (auto xt: g[v]) if (dist[xt]==dist[v]-1) makePath(xt);
  36. }
  37.  
  38. int main()
  39. {
  40.     scanf ("%d", &n);
  41.     for (int i=1;i<n;i++)
  42.     {
  43.         int a, b;
  44.         scanf ("%d%d", &, &b);
  45.         g[a].push_back(b);
  46.         g[b].push_back(a);
  47.     }
  48.  
  49.     dist[0]=-1;
  50.     pair<int, int> p=dfs(dfs (1, 0).second, 0);
  51.     makePath(p.second);
  52.  
  53.     for (int i=1;i<=n;i++)
  54.     {
  55.         if (dist[i]==p.first/2 && path[i])
  56.         {
  57.             printf ("%d", i);
  58.             break;
  59.         }
  60.     }
  61.  
  62.     return 0;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment