LCA - Lowest Common Ancestor

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------debug\n"); using namespace std; const int maxn=1010; int n,m; int head[maxn],to[maxn<<1],nxt[maxn<<1],tot=0; int dep[maxn],f[maxn][maxn]; void add(int u,int v) { to[++tot]=v; nxt[tot]=head[u]; head[u]=tot; } void dfs1(int u,int fa) { f[v][0]=u;dep[u]=dep[fa]+1; for(int i=0;i<=20;i++) f[u][i+1]=f[f[u][i]][i]; for(int i=head[u];i;i=nxt[i]) { int v=to[i]; if(v==fa) continue; dfs1(v,u); } } int LCA (int x,int y) { if(dep[x]<dep[y]) swap(x,y); for(int i=20;i>=0;i--)//¶þ½øÖÆÎÜÏÝ·Ö¸î { if(dep[f[x][i]]>=dep[y]) x=f[x][i]; if(x==y) return x; } for(int i=20;i>=0;i--) { if(f[x][i]!=f[y][i]) { x=f[x][i]; y=f[y][i]; } return f[x][0]; } } int dis(int x,int y){ return dep[x]+dep[y]-2*dep[LCA(x,y)]; } int main() { ios::sync_with_stdio(false); cin.tie(0); int T,cnt=0; cin>>T; while(++cnt<=T) { memset(f,0,sizeof(f)); memset(dep,0,sizeof(dep)); memset(head,0,sizeof(head)); memset(to,0,sizeof(to)); memset(nxt,0,sizeof(nxt)); cin>>n; for(int i=1;i<=n;i++) { cin>>m; for(int j=1;j<=m;j++) { int tmp; cin>>tmp; add(i,tmp);add(tmp,i); } } dfs1(1,1); int Q; cin>>Q; cout<<"Case "<<cnt<<":"<<'\n'; while(Q--) { int u,v; cin>>u>>v; cout<<LCA(u,v)<<'\n'; } } return 0; } /* #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------debug\n"); using namespace std; int n,m,dep[1010],fa[1010][1010]; vector<int> g[1010]; void dfs1(int x,int faa) { fa[x][0]=faa; dep[x]=dep[faa]+1; for(int i=0;i<=15;i++) { fa[x][i+1]=fa[fa[x][i]][i]; } for(int i=0;i<g[x].size();i++) { int v=g[x][i]; if(v==faa) continue; dfs1(v,x); } } int LCA(int x,int y) { if(dep[x]<dep[y]) swap(x,y); for(int i=15;i>=0;i--) { if(dep[fa[x][i]]>=dep[y]) x=fa[x][i]; if(x==y) return x; } for(int i=15;i>=0;i--) { if(fa[x][i]!=fa[y][i]) { x=fa[x][i]; y=fa[y][i]; } else return fa[x][0]; } } int main() { ios::sync_with_stdio(false); cin.tie(0); int T,cnt=0; cin>>T; while(++cnt<=T) { memset(fa,0,sizeof(fa)); memset(dep,0,sizeof(dep)); for(int i=1;i<=1009;i++) g[i].clear(); cin>>n; for(int i=1;i<=n;i++) { cin>>m; for(int j=1;j<=m;j++) { int tmp; cin>>tmp; g[i].push_back(tmp); } } dfs1(1,1); int Q; cin>>Q; cout<<"Case "<<cnt<<":"<<'\n'; while(Q--) { int u,v; cin>>u>>v; cout<<LCA(u,v)<<'\n'; } } return 0; } */