fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int dp[1001][10];
  4. int level[1001];
  5. void dynamic(int,int,int,vector<int>*);
  6. int lca(int,int,int);
  7. int main()
  8. {
  9. int tc,n,m,q,v,w,i,j,k,temp;
  10. cin>>tc;
  11. for(i=0;i<tc;i++){
  12. cin>>n;
  13. vector<int> vec[n+1];
  14. for(j=1;j<=n;j++){
  15. cin>>m;
  16. for(k=0;k<m;k++){
  17. cin>>temp;
  18. vec[j].push_back(temp);
  19. vec[temp].push_back(j);
  20. }
  21. }
  22. int log=ceil(log2(n));
  23. level[1]=0;
  24. dynamic(log,1,1,vec);
  25. cin>>q;
  26. cout<<"Case "<<i+1<<":"<<endl;
  27. for(j=0;j<q;j++){
  28. cin>>v>>w;
  29. cout<<lca(v,w,log)<<endl;
  30. }
  31. }
  32. }
  33. void dynamic(int log,int u,int parent,vector<int>*vec)
  34. {
  35. dp[u][0]=parent;
  36. for(int i=1;i<=log;i++)
  37. dp[u][i]=dp[dp[u][i-1]][i-1];
  38.  
  39. vector<int>::iterator it;
  40. for(it=vec[u].begin();it!=vec[u].end();it++){
  41. if(*it!=parent){
  42. level[*it]=level[u]+1;
  43. dynamic(log,*it,u,vec);
  44. }
  45. }
  46. }
  47. int lca(int u,int v,int log)
  48. {
  49. if(level[u]<level[v])
  50. swap(u,v);
  51. for(int i=log; i>=0; i--)
  52. if(level[u]-pow(2,i)>=level[v])
  53. u=dp[u][i];
  54. if(u==v)
  55. return u;
  56. for(int i=log;i>=0;i--){
  57. if(dp[u][i]!=dp[v][i]){
  58. u=dp[u][i];
  59. v=dp[v][i];
  60. }
  61. }
  62. return dp[u][0];
  63. }
  64.  
Success #stdin #stdout 0s 4448KB
stdin
1
7
3 2 3 4
0
3 5 6 7
0
0
0
0
2
5 7
2 7
stdout
Case 1:
3
1