定义
欧拉路径: 经过图中每一条边恰好一次的路径
欧拉回路: 起点和终点是同一个点的欧拉路径
欧拉图: 有欧拉回路的图
半欧拉图: 有欧拉路径的图
判断
怎么判断一张图有没有欧拉路径或欧拉回路呢?
有向图
如果图中所有的点的入度都等于出度并且这张图的基图联通,那么就存在欧拉回路。
简单感性的证明:因为入度和出度相同,所以每次进入一个点的时候,就必定能够出去,最后走回起点。
如果图中有一个点出度比入度大1,一个点入度比出度大1,其他的点入度和出度相等,那么就存在一条从出度比入度大1的点
出发到入度比出度大1的点
的欧拉路径,证明和上面类似。
无向图
如果图中所有点的度都是偶数,那么就存在欧拉回路,证明和上面类似。
如果图中有且仅有两个奇点(度为奇数的点),那么就存在从其中一个奇点到另一个奇点的欧拉路径。
查找
找欧拉回路和欧拉路径的方法大体相同,有两种算法(Fleury算法和hierholzer算法),但是它们的本质是一样的。
做法很简单,从上面的判断可知,如果存在欧拉回路,那么随便从一个点出发,乱走,最后一定能走回自己,那么乱走即可,顺路记下路径,完美完成任务。
因为每条边只能走一次,所以走过之后要将边给删掉,可以打一个暴力的邻接矩阵 O ( n 2 ) O(n^2) O(n2),更优秀一点的可以用一个平衡树来维护与自己相连的点们 O ( n l o g n ) O(nlogn) O(nlogn)。
欧拉路径的话,因为有两个特殊的奇点,我们只需要根据图中点的度将这两个点找出来,从其中一个出发乱走即可。
注意,大前提是这个图中有欧拉回路!
模板题在此。
应用
这里举一个简单经典的例子。
有 n ( n < = 100000 ) n(n<=100000) n(n<=100000) 个单词,如果 a a a 单词的尾字母和 b b b 单词的首字母相同,那么 b b b 可以接在 a a a 的后面,现在问是否能用这些单词连成一个环(不必用完)。
如果将单词视为点,将连接关系视为边,那么发现不好做,于是需要神奇的改变点和边所代表的对象。
将 26 26 26 个字母视为点,将单词视为边,单词的首字母连向单词的尾字母,这样我们只需要找到图中的欧拉回路即可。
时间有点紧,于是写的有些潦草简短,以后发现欧拉回路和欧拉路径的优秀应用后一定会回来补一补的qwq。