问题
求无向图UG和有向图DG的欧拉回路。
无向图判断欧拉回路的存在
无向图UG的任意顶点vi的度数为偶数(注意这里的度数是指无向图的边数),则该无向图存在欧拉回路;
无向图求欧拉回路
用Fleury算法求无向图G=<V,E>的欧拉回路。设G(i,j)=1表示顶点vi可以到达顶点vj,G(i,j)=0表示顶点vi无法到达vj。
上面的无向图可以表示为矩阵:
G=0100010101101001000010100111000101011011000011000 类似DFS搜索。从任意顶点v0开始访问,选取它的邻节点vj作为下一个访问的顶点(经过边e0,j,根据无向图性质可知,必然有G(i,j)=G(j,i)=1)。每经过一条边将其删除(令G(i,j)=G(j,i)=0),递归的重复该搜索操作,直到再次回到起点v0,算法结束。整个过程中经过的边即为该图的欧拉回路。如图所示:
Fleury算法的时间复杂度是O(∥E∥)。
有向图判断欧拉回路的存在
有向图DG的任意顶点vi满足ini=outi,即出度等于入度,则该有向图存在欧拉回路;
有向图求欧拉回路
有向图的欧拉回路的求解方法与无向图一样。
源码
EulerCycle.h
EulerCycle.cpp
测试
EulerCycleTest.cpp