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");
    ......
}

posted @ 2019-12-12 17:42  ssllyf  阅读(200)  评论(0编辑  收藏  举报