东方博宜OJ 2052:图的 dfs 遍历 → 引出 DFS 序及欧拉序
【题目来源】
【题目描述】
一个有 n 个结点的无向连通图,这些结点以编号 1,2,...,n 进行编号,现给出结点间的连接关系。
请以结点 1 为起点,按 dfs(深度优先搜索)、优先访问小编号结点的顺序遍历并输出该图。
【输入格式】
第一行为两整数,n 和 e,表示 n 个顶点,e 条边。(2≤n,e≤10)
以下 e 行每行两个数,表示两个结点是连通的。
【输出格式】
只有一行,为按照优先访问小编号结点的 dfs 的结果。
【输入样例】
5 7
1 2
1 3
1 4
2 4
2 5
3 5
4 5
【输出样例】
1 2 4 5 3
【数据范围】
2≤n,e≤10
【算法分析】
● 本题是一道“图的 dfs 遍历”的题目,虽然给出了其代码。但我求解此题的目的是在深度优先搜索(DFS)的代码基础上引出 DFS 序和欧拉序的代码。
● DFS 序和欧拉序是树结构序列化最常用的两种方法。它们在树上莫队、树链剖分、子树统计等问题中经常出现。
● DFS 序和欧拉序的代码,与 DFS(深度优先搜索) 的代码差别不大。
(1)求解本题的 DFS 序代码(相比于深度优先搜索代码引入了时间戳数组 ts[] 及变量 idx)
(2)求解本题的欧拉序代码(相比于深度优先搜索代码引入了 euler[]、in[]、out[] 数组及变量 idx)
euler[]:存储完整的长度为 2n 的欧拉序列(本体)
in[]:记录每个节点的入栈位置(用于确定区间左/右端点)
out[]:记录每个节点的出栈位置(非祖孙路径时左端点用 out[u])
基于本题样例,其欧拉序的求解过程如下所示:
【算法代码】
【参考文献】

浙公网安备 33010602011771号