Advertisement
Guest User

draft

a guest
Mar 20th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define sz(x) ((int)(x).size())
  3. #define endl '\n'
  4. #define debug(X) cout << #X << " = " << X << endl
  5. #define rep(i,a,b) for(int(i)=(a);(i)<(b);i++)
  6. #define SZ(v) (int)v.size()
  7.  
  8. using namespace std;
  9. typedef long long ll;
  10. const int mod = (int) 1e9 + 7;
  11. const int oo = (int) 1e9;
  12.  
  13. const int N = 1e5 + 2, E = 2e5 + 3;
  14.  
  15. int n, m, e;
  16. int src, dst;
  17. int head[N], nxt[E], to[E], lev[N], Log[N], par[N], subtree[N];
  18. int dp[20][N];
  19.  
  20. void init()
  21. {
  22.     e = 0;
  23.     memset(head,-1,sizeof(head));
  24.     memset(subtree,0,sizeof(subtree));
  25.     lev[0]=0;
  26.     Log[1] = 0;
  27.     rep(i,2,N)
  28.         Log[i] = Log[i/2] + 1;
  29. }
  30.  
  31. void addEdge(int f, int t)
  32. {
  33.     nxt[e] = head[f];
  34.     head[f] = e;
  35.     to[e++] = t;
  36. }
  37.  
  38. void addBiEdge(int a, int b)
  39. {
  40.     addEdge(a, b);
  41.     addEdge(b, a);
  42. }
  43.  
  44. int DFS(int u, int p)
  45. {
  46.     par[u] = p;
  47.     for(int k=head[u]; ~k; k=nxt[k])
  48.     {
  49.         int v = to[k];
  50.         if(v==p) continue;
  51.         lev[v]=lev[u]+1;
  52.         subtree[u] += DFS(v,u);
  53.     }
  54.     return 1 + subtree[u];
  55. }
  56.  
  57. void pre()
  58. {
  59.     memset(dp, -1, sizeof dp);
  60.     for(int i = 0 ; i < N ; i++)
  61.         dp[0][i] = par[i];
  62.     for(int j = 1 ; (1<<j) <= N ;j++)
  63.         for(int i = 0 ; i < N ; i++)
  64.             if(dp[j-1][i] != -1)
  65.                 dp[j][i] = dp[j-1][dp[j-1][i]];
  66. }
  67.  
  68. int LCA(int u, int v)
  69. {
  70.   if(lev[u] < lev[v])
  71.     swap(u, v);
  72.  
  73.   for(int i = Log[N] ; i >= 0 ; i--)
  74.     if(lev[u] - (1 << i) >= lev[v])
  75.       u = dp[i][u];
  76.  
  77.   if(u == v)
  78.     return u;
  79.  
  80.   for(int i = Log[N] ; i >= 0 ; i--)
  81.     if(dp[i][u] != -1 && dp[i][u] != dp[i][v])
  82.       u = dp[i][u], v = dp[i][v];
  83.  
  84.   return par[u];
  85. }
  86.  
  87. int main()
  88. {
  89.     init();
  90.     int n,q,a,b;
  91.     int ans= 0;
  92.     cin>>n>>q;
  93.     rep(i,0,n-1)
  94.     {
  95.         cin>>a>>b;
  96.         addBiEdge(--a, --b);
  97.     }
  98.     DFS(0,-1);
  99.     pre();
  100.     a = 2;
  101.     b = 4;
  102.     int c = LCA(a,b);
  103.     cout<<lev[a]<<" "<<lev[b]<<endl;
  104.     printf("%d", lev[a]+lev[b]-2*lev[c]);
  105.     return 0;
  106. }
  107. /*
  108. 5 2
  109. 1 2
  110. 1 5
  111. 2 3
  112. 2 4
  113. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement