简介
欧拉回路就是给一个图,存在一条回路把所边经过且每条边只经过一次。
存在欧拉回路的条件
- 对于无向图:
存在欧拉回路的条件:每个点的度都为偶数;
存在欧拉路的条件:有且只有两个点的度为一,且这两个点分别为起点和终点;
- 对于有向图:
存在欧拉回路的条件:每个点出度等于入度;
存在欧拉路的条件:存在一个点出度比入度多一作为起点,存在一点入度比出度多一作为终点,其余点出度等于入度;
一句话就是:一笔画问题能成立的条件:有2个奇点或没有奇点(奇点指该点度数为奇数)
套圈法
判断是否存在欧拉回路很好判断,那怎么求欧拉回路呢?
我们采用套圈法,dfs回溯的时候才把边倒着记录。为什么要这样呢?
以奇点作为起始点(如果没有奇点就任意一个点)作为起点开始遍历整个图。
假如我们随便走,有一条边加一条边,最后回到起始点,会形成一个环。但是我们不能保证没有其他环还没遍历到!
下面拿个图演示一波:
红色为起始点,蓝色为有向边,随便走的话我们可能走完左边的圈就不走了,右边的圈还没走。
而套圈法则是,如果我们遇到分叉点就都走一走,这样能保证每条边都走过,最后倒着加边即可。
(各位可以模拟一下回溯的过程,回溯到两环交点时,有边没走过就会继续走的)
注意每条边只走一次,每次走完一条边我们要标记走过,这样就能保证复杂度。
复杂度嘛,每条边只走一次,复杂度是<