SP14932 LCA - Lowest Common Ancestor
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1005; 4 const int maxm=3005; 5 struct edge{int to,nex;}e[maxm]; 6 int head[maxn],tot; 7 int deep[maxn],f[maxn][30]; 8 int T,n,m,q; 9 inline void add(int x,int y){e[++tot].to=y;e[tot].nex=head[x];head[x]=tot;} 10 void dfs(int k) 11 { 12 for(int i=head[k];i;i=e[i].nex) 13 { 14 if(!deep[e[i].to]) 15 { 16 deep[e[i].to]=deep[k]+1; 17 f[e[i].to][0]=k; 18 dfs(e[i].to); 19 } 20 } 21 } 22 void init() 23 { 24 for(int j=1;(1<<j)<=n;++j) 25 for(int i=1;i<=n;++i) 26 if(f[i][j-1]) f[i][j]=f[f[i][j-1]][j-1]; 27 } 28 int LCA(int x,int y) 29 { 30 if(deep[x]<deep[y]) swap(x,y); 31 int i;for(i=0;(1<<i)<=n;++i);--i; 32 for(int j=i;j>=0;--j) if(deep[x]-(1<<j)>=deep[y]) x=f[x][j]; 33 if(x==y) return x; 34 for(int j=i;j>=0;--j) if(f[x][j]&&f[x][j]!=f[y][j]) x=f[x][j],y=f[y][j]; 35 return f[x][0]; 36 } 37 void clear() 38 { 39 tot=0; 40 memset(f,0,sizeof(f)); 41 memset(deep,0,sizeof(deep)); 42 memset(head,0,sizeof(head)); 43 memset(e,0,sizeof(e)); 44 } 45 int main() 46 { 47 scanf("%d",&T); 48 for(int i=1;i<=T;++i) 49 { 50 scanf("%d",&n); 51 for(int j=1;j<=n;++j) 52 { 53 scanf("%d",&m); 54 for(int k=1,tmp;k<=m;++k) 55 { 56 scanf("%d",&tmp); 57 add(j,tmp); 58 } 59 } 60 dfs(1); 61 init(); 62 scanf("%d",&q); 63 printf("Case %d:\n",i); 64 for(int i=1,x,y;i<=q;++i) scanf("%d%d",&x,&y),printf("%d\n",LCA(x,y)); 65 clear(); 66 } 67 return 0; 68 }