Rt 悬赏关注 谢谢
#include<bits/stdc++.h>
#define F(_b,_e) for(int i=_b;i<=_e;i++)
using namespace std;
inline int read(){
int f=1,x=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return f*x;
}
const int MAXN=1010;
struct edge{
int v,nxt;
}e[MAXN<<1];
int num=0,head[MAXN],fa[MAXN][24],deep[MAXN];
void add_edge(int u,int v){
num++;
e[num].nxt=head[u];
e[num].v=v;
head[u]=num;
}
void dfs(int p,int f){
deep[p]=deep[fa[p][0]]+1;
for(int i=0;fa[p][i];i++)
fa[p][i+1]=fa[fa[p][i]][i];
for(int i=head[p];i;i=e[i].nxt){
int v=e[i].v;
if(v==f) continue;
fa[v][0]=p;
dfs(v,p);
}
}
int lca(int m,int n){
if(deep[m]>deep[n]) swap(m,n);
for(int i=23;i>=0;i--)
if(deep[fa[n][i]]>=deep[m])
n=fa[n][i];
if(m==n)
return m;
for(int i=23;i>=0;i--){
if(fa[m][i]!=fa[n][i]){
m=fa[m][i];
n=fa[n][i];
}
}
return fa[m][0];
}
int main(){
ios::sync_with_stdio(0);
int T;
T=read();
int k=T;
while(T--){
memset(e,0,sizeof(e));
memset(fa,0,sizeof(fa));
memset(deep,0,sizeof(deep));
memset(head,0,sizeof(head));
int n;
n=read();
for(int i=1;i<=n;i++){
int m=read();
for(int j=1;j<=m;j++){
int v=read();
add_edge(i,v);
add_edge(v,i);
}
}
dfs(1,0);
int q=read();
cout<<"Case "<<k-T<<":"<<endl;
for(int i=1;i<=q;i++){
int u,v;
u=read();
v=read();
cout<<lca(u,v)<<endl;
}
}
return 0;
}