欧拉路径 & 欧拉图 小记

欧拉路径 & 欧拉图 小记

P7771 【模板】欧拉路径

欧拉路径:一个图中经过每条边恰好一次的路径,允许经过重复点。

欧拉回路:起点与终点相同的欧拉路径。

对于连通图,欧拉路径有如下判定:

  1. 对于无向图,恰好有两个点度数为奇数时,存在起点与终点不同的欧拉路径,且起点与终点就是这两个奇度数的点。
  2. 对于无向图,所有点度数均为偶数时,存在欧拉回路。
  3. 对于有向图,存在一个点 \(x\) 满足 \(deg_{out}+1=deg_{in}\),且存在一个点 \(y\) 满足 \(deg_{in}+1=deg_{out}\),且其他点入度等于出度,则存在起点与终点不同的欧拉路径,且 \(x\) 是起点,\(y\) 是终点。
  4. 对于有向图,所有点入度等于出度,存在欧拉回路。

寻找欧拉路径

基本思想:定义递归函数 \(dfs(x)\) 返回一个 \(x\) 的环,过程如下,先找到一个 \(x\) 的环 \(T\) 使得每条边都没有被走过,然后对于环上的每一个点 \(y\),将 \(dfs(y)\) 返回的环插入 \(T\) 中。

算法实际上不太一样,对于 \(dfs(x)\)

  1. 首先遍历每条未走过的出边(可能之前调用过 \(x\) 导致一些出边已走过)到 \(v\)
  2. 调用 \(dfs(v)\)
  3. 当所有出边都遍历完后,将 \(x\) 加入答案序列。

最后倒序输出答案序列即题目所需的答案。

本题还要求字典序最小,因此需要将出边排序,用 vector 记录出边。

实现上对于每一个点 \(x\) 记录 \(cur_x\) 表示当前弧,因为一个递归树中可能出现标号为 \(x\) 的点的子树内又出现了标号为 \(x\) 的点。

posted @ 2025-10-05 17:24  dengchengyu  阅读(12)  评论(0)    收藏  举报