
思路:
直接跑lca,那一个两个一起往上跳的部分可以简略不写
codecodecode
#include<iostream>
#include<cstdio>
using namespace std;
int n, s;
int tot, head[101000];
int f[101000][25], dep[101000];
struct node
{
int to, next;
}b[201000];
void add(int x, int y)
{
b[++tot]=(node){y, head[x]};
head[x]=tot;
}
void dfs(int x, int fa)
{
dep[x]=dep[fa]+1;
f[x][0]=fa;
for(int i=1; i<=20; i++)
f[x][i]=f[f[x][i-1]][i-1];
for(int i=head[x]; i; i=b[i].next)
{
int y=b[i].to;
if(y==fa)
continue;
dfs(y, x);
}
}
int lca(int x, int y)
{
if(dep[x]>dep[y])
swap(x, y);
for(int i=20; i>=0; i--)
if(dep[f[y][i]]>=dep[x])
y=f[y][i];
if(y==x)
return x;
else return 0;
}
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; i++)
{
int x, y;
scanf("%d%d", &x, &y);
if(y==-1)
s=x;
else
add(x, y), add(y, x);
}
dfs(s, 0);
int q;
scanf("%d", &q);
while(q--)
{
int x, y;
scanf("%d%d", &x, &y);
if(lca(x, y)==x)
printf("1\n");
else if(lca(x, y)==y)
printf("2\n");
else printf("0\n");
}
return 0;
}
204

被折叠的 条评论
为什么被折叠?



