dfs序
dfs序
记录下每个点在dfs中进出栈的时间顺序
如上图,
入栈顺序(bg)为
1 2 6 3 4 7 5
出栈顺序为(ed)
7 5 7 3 5 7 5
然后我们可以发现一个规律:
如果一个点x在y的子树之中,那么bg[y]<bg[x]<=ed[y]
如果x不在y的子树之中,则一定不满足上面式子
我们就可以通过这个规律来求一个点是否在另一个点的子树之中(一个点是否是另一个点的祖先)
代码
void dfs(int x)
{
bg[x] = ++k;
for (int i = head[x]; i; i = e[i].next)
dfs(e[i].to);
ed[x] = k;
}
int main()
{
......
scanf("%d%d", &x, &y);
if (bg[y] < bg[x] && bg[x] <= ed[y]) printf("Yes\n");
else printf("No\b");
......
}