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. ios_base::sync_with_stdio(false);
  10. cin.tie(NULL);
  11. int tc,n,m,q,v,w,i,j,k,temp;
  12. cin>>tc;
  13. for(i=0;i<tc;i++){
  14. cin>>n;
  15. vector<int> vec[n+1];
  16. for(j=1;j<=n;j++){
  17. cin>>m;
  18. for(k=0;k<m;k++){
  19. cin>>temp;
  20. vec[j].push_back(temp);
  21. vec[temp].push_back(j);
  22. }
  23. }
  24. int log=ceil(log2(n));
  25. level[1]=0;
  26. dynamic(log,1,1,vec);
  27. cin>>q;
  28. cout<<"Case "<<i+1<<":"<<endl;
  29. for(j=0;j<q;j++){
  30. cin>>v>>w;
  31. cout<<lca(v,w,log)<<endl;
  32. }
  33. }
  34. }
  35. void dynamic(int log,int u,int parent,vector<int>*vec)
  36. {
  37. dp[u][0]=parent;
  38. for(int i=1;i<=log;i++)
  39. dp[u][i]=dp[dp[u][i-1]][i-1];
  40.  
  41. vector<int>::iterator it;
  42. for(it=vec[u].begin();it!=vec[u].end();it++){
  43. if(*it!=parent){
  44. level[*it]=level[u]+1;
  45. dynamic(log,*it,u,vec);
  46. }
  47. }
  48. }
  49. int lca(int u,int v,int log)
  50. {
  51. if(level[u]<level[v])
  52. swap(u,v);
  53. for(int i=log; i>=0; i--)
  54. if(level[u]-pow(2,i)>=level[v])
  55. u=dp[u][i];
  56. if(u==v)
  57. return u;
  58. for(int i=log;i>=0;i--){
  59. if(dp[u][i]!=dp[v][i]){
  60. u=dp[u][i];
  61. v=dp[v][i];
  62. }
  63. }
  64. return dp[u][0];
  65. }
  66.  
Success #stdin #stdout 0s 4404KB
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