一、算法介绍及实现过程:
- 程序的输入为对应图的结点数和图中与各结点相连的点的编号。(注:无向图中的多重边和自环需多次输入;有向图中的多重边需多次输入)
- 程序的第一步是求出图的邻接矩阵。邻接矩阵反映了点与点之间的关系,通过输入各结点相连的点的编号,建立邻接矩阵,并打印出来。
- 程序的第二步是判断图的连通性。我主要采用了DFS,即暴力递归的方法。无向图中若存在欧拉回路,则必然是连通的;有向图中若存在欧拉回路,则必然是强连通的。因此,二者均可采用同种遍历方法:从一点出发向下遍历,标记经过的点(遇到标记过的点,则直接跳过),最后检查是否所有的点均被标记。区别在于,无向图选取任意一点作为起始点,结果相同;但有向图,从某一点开始未能标记全部点,只能说明该图不是强连通图(不能证明其不连通),但可以确定其不存在欧拉回路。
- 程序的第三步是判断是否有欧拉回路。运用知识点:无向图有欧拉回路,则无奇度顶点;有向图有欧拉回路,则所有顶点的出度等于入度。使用双层循环遍历邻接矩阵,对无向图求每行的和,并判断是否为偶数;对有向图分别求第n行和第n列的和,并判断二者是否相等。
- 程序的最后一步是在有欧拉回路的情况下,输出一条欧拉回路。这里,我同样采用了DFS,但准确的来说,是逐步插入回路法,也称Hierholzer 算法。该算法的核心思想是逐个寻找回路,过程中删除经过的路线,并通过回溯,从一个回路末端进入到下一个回溯的入口,并把相应的点加入到路线中。通俗的说,就是不断地寻找图中的回路,并把沿途路线删掉,找到了一个回路,就相当于从图中删除了这个回路,对欧拉图而言,删掉了一个回路,剩下部分的仍然构成欧拉图,然后回溯到上一个非末端点(把末端点加入路线),继续寻找回路。直到找到了所有的回路,这些回路的路线连起来就构成了一条欧拉回路,之后,开始回溯,把该路线记录下来。
二、算法的表示框图:
1、总体框架:

<

本文介绍了一种基于DFS的欧拉回路算法实现方法,包括图的邻接矩阵构造、连通性判断、欧拉回路的存在性验证及具体路径查找。适用于无向图和有向图。
最低0.47元/天 解锁文章
491

被折叠的 条评论
为什么被折叠?



