6.4.4 用 dfs 求欧拉回路 (UVa 10129)
欧拉回路:该回路遍历了一个图中所有的边,并且每条边只遍历一次。(一笔画) 欧拉路径:从起点开始到终点,遍历了图中所有的边,并且每条边只遍历一次。 度数:一个点连接了几条边。 入度和出度分别指:进入该点的边的数量,走出该点的边的数量。 连通无向图存在欧拉回路的充要条件:所有点的度数都为偶数。 连通无向图存在欧拉路径的充要条件:仅存在两个度数为奇数的点,其他点的度数都为偶数。(这两个度数为奇数的点,一个为奇数,一个为偶数) 连通有向图存在欧拉回路的充要条件:对于所有的点,入度等于出度。 连通有向图存在欧拉路径的充要条件: 仅存在两个点,其中一个点的入度比出度大一,另一个店的出度比入度大一。(出度大的为起点,入度大的为终点) 根据连通性和度数可判断出无向图和有向图是否存在欧拉回路和欧拉路径,可用 dfs 构造欧拉回路和欧拉路径。 基本思路:使用 dfs 的方式,遍历图中所有的点。dfs 一个环,然后在回溯的过程中,可能会遇到一个公共点连接着另一个环,此时再对这个公共点进行 dfs 遍历另一个环…… 如此递归。在 dfs 完与 u 结点相连的 v 结点后,再将 u,v 这条边压入输出栈(采用逆序的顺序输出结果,因为 dfs 栈帧入栈的顺序与出栈的顺序相反,起始点最后才出栈)。 例如:用 dfs 求该图的欧拉路径 dfs 遍历该图的顺序为: (1, 2) (2, 3) (3, 4) (4,