基于DFS的求欧拉回路算法


6、基于DFS的求欧拉回路算法:

笔记:

欧拉回路:指能够一遍不重复的走过所有边的图(经过点次数可以不计)

哈密尔顿圈:指能狗一次不重复走过所有点的图(经过边的次数可以不计)

对于哈密尔顿圈,并没有什么有效的算法,对于欧拉回路我们可以使用基于DFS算法的思想来寻求一张图是否存在回路


当然,欧拉回路其实有一下性质:

*如果图中奇数度的顶点个数小于等于2,则一定存在欧拉回路

*在无向图中每个顶点的度都是偶数,则一定存在回路

*在有向图中,每个节点的入度等于出度,则存在回路



实现思路:

寻找欧拉回路要分为两种情况:

**图中存在一个或两个读书为奇数的点,这是,起点必须是度数为奇数的点,必然的,终点必须为另一个度数为奇数的(如果是两个度数为奇数的点)

**图中的点的读书都是偶数,这就可以任意起点


选定起点后,每次依照起点,找出回路,显示出来,删除环路的边,将环路点序记下

在剩下的图中,继续深搜,找到环路,在已有的点序中添加一个环进去

直到图中不存在环



基于DFS的求欧拉回路算法_第1张图片



实现过程:

通过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-A

DFS遍历,发现没有通路和环路了,到i结束

最终欧拉回路:A-G-F-E-J-D-I-C-H-B-G-H-I-J-F-A

注意:以上的每次回路寻找都是不定的,只要有回路就可以了
















你可能感兴趣的:(数据结构与算法)