6、基于DFS的求欧拉回路算法:
笔记:
欧拉回路:指能够一遍不重复的走过所有边的图(经过点次数可以不计)
哈密尔顿圈:指能狗一次不重复走过所有点的图(经过边的次数可以不计)
对于哈密尔顿圈,并没有什么有效的算法,对于欧拉回路我们可以使用基于DFS算法的思想来寻求一张图是否存在回路
当然,欧拉回路其实有一下性质:
*如果图中奇数度的顶点个数小于等于2,则一定存在欧拉回路
*在无向图中每个顶点的度都是偶数,则一定存在回路
*在有向图中,每个节点的入度等于出度,则存在回路
实现思路:
寻找欧拉回路要分为两种情况:
**图中存在一个或两个读书为奇数的点,这是,起点必须是度数为奇数的点,必然的,终点必须为另一个度数为奇数的(如果是两个度数为奇数的点)
**图中的点的读书都是偶数,这就可以任意起点
选定起点后,每次依照起点,找出回路,显示出来,删除环路的边,将环路点序记下
在剩下的图中,继续深搜,找到环路,在已有的点序中添加一个环进去
直到图中不存在环
实现过程:
通过DFS搜索,找到一个回路,A-G-F-A
将边{A,G},{G,F},{F,A}删去
得到回路:A-G-F-A
通过DFS搜索,找到一个回路,F-E-J-F
将边{F,E},{E,J},{J,F}删去
得到回路:A-G-F-E-J-F-A通过DFS搜索,找到一个回路,J-D-I-J
将边{J,D},{D,I},{I,J}删去
得到回路:A-G-F-E-J-D-I-J-F-A通过DFS搜索,找到一个回路,I-C-H-I
将边{I,C},{C,H},{H,I}删去
得到回路:A-G-F-E-J-D-I-C-H-I-J-F-A
通过DFS搜索,找到一个回路,H-B-G-H
将边{H,B},{B,G},{G,H}删去
得到回路:A-G-F-E-J-D-I-C-H-B-G-H-I-J-F-ADFS遍历,发现没有通路和环路了,到i结束
最终欧拉回路:A-G-F-E-J-D-I-C-H-B-G-H-I-J-F-A
注意:以上的每次回路寻找都是不定的,只要有回路就可以了