不知道为啥就 WA 了
这是我的代码
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 1e3 + 5;
int t, n, m, q, dep[N], fa[N][15], s;
int to[N], ne[N], head[N], idx;
void dfs(int u)
{
dep[u] = dep[fa[u][0]] + 1;
s = ceil(log2(dep[u]));
for (int i = 1; i <= s; i ++ ) fa[u][i] = fa[fa[u][i - 1]][i - 1];
for (int i = head[u]; i != -1; i = ne[i]) dfs(to[i]);
}
int LCA(int x, int y)
{
s = ceil(log2(n));
if (dep[x] < dep[y]) swap(x, y);
int k = dep[x] - dep[y];
for (int i = s; i >= 0; i -- ) if (k & (1 << i)) x = fa[x][i];
if (x == y) return x;
s = ceil(log2(dep[x]));
for (int i = s; i >= 0; i -- ) if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
return fa[x][0];
}
int main()
{
scanf("%d", &t);
for (int LHY = 1; LHY <= t; LHY ++ )
{
memset(head, -1, sizeof head);
memset(to, 0, sizeof to);
memset(ne, 0, sizeof ne);
memset(fa, 0, sizeof fa);
memset(dep, 0, sizeof dep);
idx = 1;
scanf("%d", &n);
for (int i = 1; i <= n; i ++ )
{
scanf("%d", &m);
for (int v, j = 1; j <= m; j ++ )
{
scanf("%d", &v);
to[idx] = v;
ne[idx] = head[i];
head[i] = idx ++ ;
fa[v][0] = i;
}
}
for (int i = 1; i <= n; i ++ )
{
if (!fa[i][0])
{
dfs(i);
break;
}
}
int x, y;
scanf("%d", &q);
printf("Case %d:\n", t);
while (q -- )
{
scanf("%d%d", &x, &y);
printf("%d\n", LCA(x, y));
}
}
return 0;
}