DFS应用——寻找欧拉回路

DFS应用——寻找欧拉回路0 README0 1 本文总结于数据结构与算法分析 源代码均为原创 旨在理解 DFS 应用 寻找欧拉回路 的 idea 并用源代码加以实现 源代码 我还没有找到一种有效的数据结构和 DFS 进行结合 往后会 po 出 1 欧拉回路 1 1 欧拉回路定义 我们必须在图中找出一条路径 使得该路径对图的每条边恰好访问一次 如果我们要解决 附加的问题 那么我们就必须找到一个圈 该圈恰好

【0】README

0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 “DFS应用——寻找欧拉回路” 的idea 并用源代码加以实现 (源代码,我还没有找到一种有效的数据结构和DFS进行结合,往后会po出)


【1】欧拉回路

1.1)欧拉回路定义:我们必须在图中找出一条路径, 使得该路径对图的每条边恰好访问一次。如果我们要解决“附加的问题”, 那么我们就必须找到一个圈, 该圈恰好经过每条边一次, 这种图论问题在1736年 由欧拉解决, 它标志着图论的诞生;根据特定问题的叙述的不同, 这种问题通常称为 欧拉路径(Euler path, 有时称为欧拉环游——Euler tour)或欧拉回路(Euler circuit);
1.2)我们的第一个观察是, 其终点必须终止在起点上的 欧拉回路只有当图是连通的并且每个顶点的度(即边的条数)是偶数时才有可能存在。 这是因为, 在欧拉回路中, 一个顶点有边进入,必然有边离开。如果任一顶点v 的度为奇数, 那么实际上 我们早晚将会达到这样一种地步,即只有一条进入v 的边尚未被访问到,若沿该变进入v点, 那么我们只能停在顶点v, 不可能再出来。
1.3)如何得到欧拉环游:如果恰好有两个顶点的度是奇数, 那么当我们从一个奇数度的顶点出发 最后终止在另一个奇数度的顶点时,仍然有可能得到一个欧拉环游;这里, 欧拉环游是必须访问图的每一边 但最后不一定必须回到起点的路径。如果奇数度的顶点多于两个, 那么欧拉环游也是不可能存在的;
1.4)以上观察,给我们提供了欧拉回路存在 的一个必要条件,实际上,它也是一个充分条件——也就是说, 所有顶点的度均为偶数的任何连通图必然有欧拉回路;



【2】如何用线性时间检测这个充分必要条件——所有顶点的度均为偶数的任何连通图必然有欧拉回路

2.1)主要问题在于: 我们可能只访问了图的一部分而提前返回到起点。如果从起点出发的所有边均已用完, 那么图中就会有部分遍历不到;
2.2)解决方法: 是找出有尚未访问的边的路径上的第一个顶点, 并执行另外一次深度优先搜索; 这将给出另外一个回路, 吧它拼接到原来的回路上, 继续该过程直到所有的边都被遍历为止;


【3】对于以上的问题和解决方法,我们看个荔枝:

step1)欧拉回路的初始图
这里写图片描述
step2)设从顶点5开始,遍历5、4、10、5,(这里只是欧拉回路的一种可能的路径case)
这里写图片描述
step3)我们从顶点4继续遍历,因为它还带有未遍历的边;我们把本次遍历的路径拼接到上一次遍历的路径5, 4, 10, 5中, 进而得到新路径如下图所示:
这里写图片描述
step4)这时,路径上存有未被访问的边的下一个顶点是3, 此时可能的遍历路径是3, 2, 8, 9, 6, 3;同理,拼接路径后,得到新路径如下图所示:
这里写图片描述
step5)这时, 在本路径上,带有未被遍历边的下一个顶点是9, 算法找到回路9, 12, 10, 9;同理,拼接路径后,得到新路径如下图所示:
这里写图片描述









【4】对算法实现的说明(Specification):

  • S1)为使路径拼接简单, 应该吧路径作为一个链表保留;
  • S2)为避免重复扫描邻接表, 对于每个邻接表我们必须保留一个指向最后扫描到的边的指针;
  • S3)当拼接进一个路径时, 必须从拼接点开始search 新vertex, 从这个new vertex 进行下一轮深度优先搜索(DFS)
  • S4)这将保证在整个算法期间对顶点搜索阶段所进行的全部工作量为 O(|E|), 使用适当的数据结构, 算法的运行时间为 O(|E|+|V|);

4.1)哈密尔顿圈问题: 一个非常相似的问题是在无向图中寻找一个简单的圈, 该圈通过图的每个顶点;(虽然看起来这个问题和 欧拉回路差不多, 但是对它却没有已知的有效算法)


【5】source code + printing results

5.1)download source code:
5.2)source code at a glance:(for complete code , please click the given link above)
5.3)printing results:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211281.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午10:48
下一篇 2026年3月18日 下午10:48


相关推荐

  • hd2616

    hd2616

    2021年9月27日
    47
  • pycharm配置tensorflow环境_pycharm run configuration

    pycharm配置tensorflow环境_pycharm run configuration先要安装Pylint:我用的python3pip3installpylintpip3installflake8进入PyCharm,从菜单栏,依次进入:File->Settings->Tools->ExternalTools。“+”,进行添加。需要填写的部分分别是:“Name”,“ToolSettings->Programs”、“To…

    2025年11月6日
    3
  • 导航窗口用html语言怎么写,html通用导航条制作详解

    导航窗口用html语言怎么写,html通用导航条制作详解第一步:先创建一个盒子,定义类为nav,width1000,height40px,防京东的导航,与浏览器顶部100px,margin-top:100px,看的更直观第二步:使用无序列表放置,导航条的内容,这个可以自己定,这里设定ul宽1000px;高40px;因为ul是块状元素,出现下面的样子,可以思考块状元素在firefox中和ie6下面有什么不同。通常在写样式的时候,要初始化我…

    2022年5月15日
    42
  • 中国十大技术社区你都知道哪些?

    中国十大技术社区你都知道哪些?社区是聚集一类具有相同爱好或者相同行业的群体,IT技术社区就是聚集了IT行业内的技术人,在技术社区可以了解到行业的最新进展,学习最前沿的技术,认识有相同爱好的朋友,在一起…

    2022年5月21日
    203
  • centos7设置go代理

    centos7设置go代理wgethttps://dl.google.com/go/go1.10.3.linux-amd64.tar.gztar-C/usr/local-zxvfgo1.10.3.linux-amd64.tar.gzvim/etc/profileexportGOROOT=/usr/local/goexportPATH=$PATH:$GOROOT/binexportGOPROXY=https://goproxy.cnsource/etc/profilegoversion..

    2022年7月26日
    15
  • python recvfrom函数详解_recvfrom函数详解

    python recvfrom函数详解_recvfrom函数详解intret;srtuctsockaddr_infrom;ret=revcfrom(sock,recvbuf,BUFSIZErecvfrom函数用于从(已连接)套接口上接收数据,并捕获数据发送源的地址。本函数用于从(已连接)套接口上接收数据,并捕获数据发送源的地址。对于SOCK_STREAM类型的套接口,最多可接收缓冲区大小个数据。udp的recvfrom函数,能接收指定ip和端口发…

    2022年7月23日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号