欧拉路径
算法相关
定义
- 欧拉路径:经过连通图中所有边恰好一次的路径。
- 欧拉回路:经过连通图中所有边恰好一次的环。
- 欧拉图:存在欧拉回路的图。
- 半欧拉图:存在欧拉路径但不存在欧拉回路的图。
判定
有向图
记 \(in_x\) 表示 \(x\) 的入度,\(out_x\) 表示 \(x\) 的出度。若点 \(x\) 满足 \(in_x = out_x + 1\),则 \(f(x) = \operatorname{True}\),否则 \(f(x) = \operatorname{False}\);若 \(in_x + 1 = out_x\),则 \(g(x) = \operatorname{True}\),否则 \(g(x) = \operatorname{False}\);若 \(in_x = out_x\),则 \(t(x) = \operatorname{True}\),否则 \(t(x) = \operatorname{False}\)。
欧拉路径
若一张有向图 \(G\) 弱连通,并且当且仅当一个点 \(x\) 满足 \(f(x) = \operatorname{True}\),另一个点 \(y(y \not = x)\) 满足 \(g(y) = \operatorname{True}\),其余点 \(u(u \not = x, y)\) 满足 \(t(u) = \operatorname{True}\),则称图 \(G\) 存在欧拉路径。
欧拉回路
若一张有向图 \(G\) 弱连通,并且当且仅当所有点 \(u\) 满足 \(t(u) = \operatorname{True}\),则称图 \(G\) 存在欧拉回路。
无向图
记 \(deg_x\) 表示点 \(x\) 的度数。若点 \(x\) 满足 \(2 \mid deg_x\),则 \(o(x) = \operatorname{True}\),否则 \(o(x) = \operatorname{False}\)。
欧拉路径
若一张无向图 \(G\) 连通,并且当且仅当两个不同的点 \(x, y\) 满足 \(o(x) = o(y) = \operatorname{False}\),其余点 \(u(u \not = x, y)\) 满足 \(o(u) = \operatorname{True}\),则称图 \(G\) 存在欧拉路径。
欧拉回路
若一张无向图 \(G\) 连通,并且当且仅当所有点 \(u\) 满足 \(o(u) = \operatorname{True}\),则称图 \(G\) 存在欧拉回路。
Hierholzer 构造法
对于欧拉路径,我们从理论上的欧拉路径起点开始 dfs;对于欧拉回路,从任意一点开始 dfs。
遍历当前点 \(x\) 的所有出边 \(x \to u\)。若该边未被走过则向点 \(u\) dfs。遍历完所有出边后,将点 \(x\) 加入回路,得到了一个反向的欧拉路径(回路)。
对于当前的点的剩余出边可以使用当前弧优化。
特别地,若要使得欧拉路径字典序最小,则只需在一开始将每个点的所有出边从小到大排序,并从编号最小的起点开始 dfs 即可。
习题
P1333 瑞瑞的木棍
思路
将一根木棍看成一条无向边,判断其是否存在欧拉路径即可。
P2731 [USACO3.3] 骑马修栅栏 Riding the Fences
简要题意
构造一个无向图的字典序最小的欧拉回路。
思路
对于每个点的出边按其对应点的大小排序。在此基础上再用 Hierholzer 构造可以保证字典序最小。
ABC - G - Unique Walk
简要题意
给定一张无向图和一个边集 \(S\),判断是否存在一条路径使得 \(S\) 中的边恰好出现一次。
思路
将 \(S\) 中的边成为必需边,其余边称为非必需边。将所有非必需边所连成的点缩成一个点,而后对于这张新图跑欧拉路径即可。
P7771 【模板】欧拉路径
模板题。
P1127 词链
简要题意
如果单词 \(X\) 的末字母与单词 \(Y\) 的首字母相同,则 \(X\) 与 \(Y\) 可以相连成词链,请你找到字典序最小的词链,使得每个单词在词链中出现且仅出现一次。
思路
将字母看成点,单词看成边。对于每个点的出边的点按其单词字典序排序后求其欧拉路径即可。
P3520 [POI 2011] SMI-Garbage
简要题意
给定一张无向图,你必须经过一些边奇数次,经过其余边偶数次。构造一些简单环使得其满足上述条件。
思路
欧拉路径(回路)有经典结论:存在一个方案经过这条边偶数次,就存在方案不经过这条边;存在一个方案经过这条边奇数次,就存在方案经过这条边。
因此只需要将原图的欧拉回路集合拆分成若干个简单环即可。可以用类似于求 SCC 的方法维护一个栈。
Div. 2 D. Turtle and Multiplication
简要题意
构造一个序列 \(a\),使得 \(\forall i, j(i \not = j)\) 满足 \(a_i \times a_{i + 1} \not = a_j \not = a_{j + 1}\)。
思路
不妨将 \(a_i\) 视为质数,这样原限制转化为判定两个二元组 \((a_i, a_{i + 1}), (a_j, a_{j + 1})\) 是否相同。这样就可以 \(a_i \to a_{i + 1}\) 建边,那么问题变成找到点数最少的带自环的完全图,使得这个完全图存在一条经过 \(n − 1\) 条边且不经过重复边的路径。
设这个图的点数为 \(k\),则 \(k\) 为奇数时所有点度数为偶数,是一张欧拉图,构造路径是 easy 的。若 \(k\) 为偶数,则可以删去 \((2 \times x, 2 \times x + 1)\) 这一类边使得该图变为欧拉图。继续使用 Hierholzer 构造即可。
\(k\) 是 \(O(\sqrt n)\) 级别的,可以直接循环求出。
Div. 1 B. Weird journey
简要题意
给定一张无向图,你可以选择 \(m - 2\) 条边经过 \(2\) 次,其他 \(2\) 条边经过 \(1\) 次。问有多少种方案。
思路
转化为 \(2 \times m\) 条边,可以删掉两条边。问新图存在欧拉路径的删边方案。
可以删一条边一个自环、两个自环或两条共一个顶点的边。记自环个数为 \(x\),点 \(i\) 度数为 \(deg_i\)。答案即为:
Div. 2 E. One-Way Reform
简要题意
将一张无向图定向,最大化出度等于入度的点。
思路
- 答案为原图度数为偶数的点。
证明:必要性:显然若出度等于入度则原图度数一定为偶数。充分性:考虑一个构造,不妨将所有度数为奇数的点跟一个虚点连接,那么度数为奇数的点都转化为度数为偶数的点。即该图存在欧拉回路,按照欧拉回路的方式给边定向即可。
实际实现也是把这个虚点建出来,Hierholzer 构造即可,只需要保留不包含虚点的边。
Div. 2 E. Maximum Matching
简要题意
给定四个点的无向图,在上面找一条权值最大的路径。
思路
若图不连通,那么连通块大小只能是 \(1, 2, 3\),很好证明连通块内度数为奇数的点的个数不超过两个。那这个连通块一定是欧拉图,所得的最大值就是连通块内边权和。
若图连通,那么只有四个点的度数全部为奇数的图不是欧拉图。于是你可以删掉一条非自环边,这样可以使得某两个点的度数减 \(1\) 或者将其分割为多个连通块。这都会使得图变成一个欧拉图。
那么我们只需要枚举断哪一条边即可。

浙公网安备 33010602011771号