#include <iostream>
#include <cstdio>
#include <cmath>
#include <iomanip>
#include <cstring>
using namespace std;
int h[10050],ne[20050],e[20050],deep[10050],dp[10050][20],fa[10050];
int sidecnt = 0;
void reset()
{
memset(h,0,sizeof(h));
memset(deep,0,sizeof(deep));
memset(ne,0,sizeof(ne));
memset(e,0,sizeof(e));
memset(fa,0,sizeof(fa));
sidecnt = 0;
}
void add(int a,int b)
{
sidecnt++;
ne[sidecnt] = h[a];
e[sidecnt] = b;
h[a] = sidecnt;
}
void dfs(int x)
{
dp[x][0] = fa[x];
for(int i = 1;i <= 20;i++) dp[x][i] = dp[dp[x][i-1]][i-1];
for(int u = h[x];u != 0;u = ne[u])
{
int v = e[u];
if(v == fa[x]) continue;
fa[v] = x;
deep[v] = deep[x] + 1;
dfs(v);
}
}
int lca(int x,int y)
{
if(deep[x] < deep[y]) swap(x,y);
for(int i = 20;i >= 0;i--) if(deep[dp[x][i]] > deep[y]) x = dp[x][i];
if(x == y) return y;
for(int i = 20;i >= 0;i--)
{
if(dp[x][i] != dp[y][i])
{
x = dp[x][i];
y = dp[y][i];
}
}
return fa[x];
}
int main()
{
int n,numsum,a,b;
cin >> n;
for(int i = 1;i <= n;i++)
{
reset();
cin >> numsum;
for(int i = 1;i <= numsum - 1;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
fa[numsum] = numsum;
deep[numsum] = 0;
dfs(numsum);
cin >> a >> b;
cout << lca(a,b) << endl;
}
return 0;
}
请问这段代码中dfs函数中dp数组的维护方式