EulerCycle 欧拉回路

问题

求无向图UGUG和有向图DGDG的欧拉回路。

无向图判断欧拉回路的存在

无向图UGUG的任意顶点viv_i的度数为偶数(注意这里的度数是指无向图的边数),则该无向图存在欧拉回路;

无向图求欧拉回路

FleuryFleury算法求无向图G=<V,E>G=<V,E>的欧拉回路。设G(i,j)=1G(i,j) = 1表示顶点viv_i可以到达顶点vjv_jG(i,j)=0G(i,j) = 0表示顶点viv_i无法到达vjv_j

上面的无向图可以表示为矩阵:

G=[0100010101101001000010100111000101011011000011000]G = \begin{bmatrix} 0 & 1 & 0 & 0 & 0 & 1 & 0 \\ 1 & 0 & 1 & 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 & 1 & 1 & 1 \\ 0 & 0 & 0 & 1 & 0 & 1 & 0 \\ 1 & 1 & 0 & 1 & 1 & 0 & 0 \\ 0 & 0 & 1 & 1 & 0 & 0 & 0 \end{bmatrix}

类似DFS搜索。从任意顶点v0v_0开始访问,选取它的邻节点vjv_j作为下一个访问的顶点(经过边e0,je_{0,j},根据无向图性质可知,必然有G(i,j)=G(j,i)=1G(i,j) = G(j,i) = 1)。每经过一条边将其删除(令G(i,j)=G(j,i)=0G(i,j) = G(j,i) = 0),递归的重复该搜索操作,直到再次回到起点v0v_0,算法结束。整个过程中经过的边即为该图的欧拉回路。如图所示:

FleuryFleury算法的时间复杂度是O(E)O(\| E \|)

有向图判断欧拉回路的存在

有向图DGDG的任意顶点viv_i满足ini=outiin_{i} = out_{i},即出度等于入度,则该有向图存在欧拉回路;

有向图求欧拉回路

有向图的欧拉回路的求解方法与无向图一样。

源码

EulerCycle.h

EulerCycle.cpp

测试

EulerCycleTest.cpp

Last updated