欧拉回路
1. 欧拉回路定义
从一个顶点出发沿着图的边前进,切好经过每条边一次并且回到顶点,我们称为该图是否含有欧拉回路
定理一:
连通多重图具有欧拉回路当前仅当他的每个顶点都有偶数度定理二:
连通多重图具有欧拉通路当前仅当它恰有两个奇数度顶点
在欧拉通路里,两个具有奇数度的顶点在建立一条虚拟边,那么就可以实现每个顶点都是偶数度,从而形成一条欧拉回路
1.1 欧拉路的判断
- 判断欧拉通路是否存在的方法
- 有向图:图连通,有一个顶点出度比入度大1,有一个顶点入度比出度大1,其余都是出度=入度。
- 无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。
- 判断欧拉回路是否存在的方法
- 有向图:图连通,所有的顶点出度=入度。
- 无向图:图连通,所有顶点都是偶数度。
2. 路径求解
经常会有求欧拉回路的问题, 我们可以使用欧拉回路构造的方式解决
2.1 欧拉回路的构造(Hierholzer算法)
1 | Euler(G) |
// TODO 待补充图片示例
2.2 佛勒里算法(Fleury)
G 为无向图
1、任取G中一个顶点$V_0$(如果是找欧拉通路,那么选任度为奇数的点),使$P_0=V_0$
2、假设沿$P_i= V_0e_1V_1e_2V_2…e_iV_i$ 走到顶点$v_i$,在下面的步骤中从$E(G) - {e_1e_2…e_i}$中选择$e_{i+1}$
- $e_{i+1}$ 与 $e_i$ 相关联
- 除非没有其他选择,否则$e_{i+1}$ 不应该是{$E(G) - {e_1e_2…e_i}$}中的桥
3、 当步骤2不能在进行时停止
2.2.1 桥
设无向图G(V,E)为连通图,若边集$E_l 属于 E$,在图中删除$E_l$所有边后形成的子图为非连通图,而删除$E_l$ 某一子集后得到的子图仍是连通图,那么说明$E_l$是图G的割边集
如果一条边就是那个割边集,那么我们说这条边为割边
,或者称之为桥
2.2.2 桥的求解算法(TODO)
方案一:枚举去掉每个点的情况,DFS判断时间复杂度O(n^2)
方案二:Tarjan实现
3. LC示例
LC753: 破解保险箱
因为该题一定会存在欧拉回路
1 | func crackSafe(n int, k int) string { |