【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:

DFS应用——寻找欧拉回路相关推荐

  1. [模板][持续更新]欧拉回路与欧拉路径浅析

    Luogu P2731 骑马修栅栏 Riding the Fences 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与 ...

  2. 欧拉回路 欧拉路径

    欧拉路径(瞎)定义 : 如果有一条路径使得能够走完所有的边且每一条边经过有且只有一次,这样的路径叫做欧拉路径 欧拉回路定义 : 如果有从起点出发最后回到起点的一条路径使得能够走完所有的边且每条边经过有 ...

  3. 一笔画问题(欧拉回路)

    前言 问题引入 给出一个有n个节点和m条边的图(可以是无向图也可以是有向图),要求遍历图中所有的边,但每条边只能经过一次.输出符合要求的走法. 证明 该问题最早可追溯到欧拉的七桥问题:对于下图中的七座 ...

  4. 第九章第十三节(无向图求欧拉回路)

    欧拉环游:在图中找到一条路径,从起点开始,依此经过图中的所有边,一个边只能走一次,到达终点,终点和起点可以不同 欧拉回路:在图中找到一条路径,从起点开始,依此经过图中的所有边,最后回到起点,一个边只能 ...

  5. poj 1041(欧拉回路+输出字典序最小路径)

    题目链接:http://poj.org/problem?id=1041 思路:懒得写了,直接copy吧:对于一个图可以从一个顶点沿着边走下去,每个边只走一次,所有的边都经过后回到原点的路.一个无向图存 ...

  6. python 拓扑排序 dfs bfs_图遍历算法之DFS/BFS

    在计算机科学, 图遍历(Tree Traversal,也称图搜索)是一系列图搜索的算法, 是单次访问树结构类型数据(tree data structure)中每个节点以便检查或更新的一系列机制.图遍历 ...

  7. DFS.04-海贼王之伟大航路

    题目描述 :路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁 ---------------因为伟大航路上的气候十分异常,所以来往任意两个岛屿之间的时间差别很大,从A岛到B岛可能需要1天,而从B岛到 ...

  8. 图论欧拉回路初步 BZOJ2095 POI2010 Bridges

    反正对于现在的我来说是好题.顺便膜po大犇和dingchao大犇. 网络流什么的还是再开一个专题好了. 欧拉回路问题参考论文<欧拉回路性质与应用探究>by 仇荣琦. POI2010 题解整 ...

  9. 零钱兑换 [dfs -> 背包]

    零钱兑换 前言 一.零钱兑换 二.dfs & 背包 1.dfs+剪枝暴力搜索 2.空间换时间--背包 总结 参考文献 前言 零钱兑换是一个很经典的问题,可dfs进行暴力寻找,结合一些剪枝,一般 ...

最新文章

  1. 生活总有烦心事? 可能是你数学不好
  2. 「SAP技术」MIGO 343 解冻物料库存的同时可以更改存储地点
  3. Bitcoin Cash 交易签名与构造
  4. 产品的三层境界:工具-平台-生态
  5. 错误日志类-也可以用于查看输出结构
  6. 红管2不显示服务器,红色管弦乐队2怎么建立服务器 | 手游网游页游攻略大全
  7. 摘要注释_论文摘要怎么写,小编来帮你
  8. 查看某个方法在哪里被调用_一篇文章带你查看并处理Pandas数据
  9. web性能测试基础 知识(引用)
  10. linux下的yum命令详解
  11. odoo10参考系列--测试模块
  12. iOS 快捷下载和安装并使用CocoaPods
  13. 单片机炫彩灯实训报告_单片机实验报告——流水灯
  14. windows设置开机自动启动程序
  15. 爬虫之抽屉新热榜点赞基本示例
  16. 什么句型可以 让我说出 悲伤的文法
  17. 面向对象-基础语法讲解(案例-烤地瓜、搬家具)
  18. moment自定义时间区间
  19. jxl导出excel标题乱码
  20. 微信小程序横屏字体变大的完美解决方案

热门文章

  1. 2020 ICPC NAC
  2. K - Triangle 计蒜客 - 42405
  3. B - A Funny Bipartite Graph
  4. NC51272 棋盘覆盖
  5. [蓝桥杯][2017年第八届真题]对局匹配
  6. [HDU 3625] Examining the Rooms(第一类斯特林数)
  7. P4233-射命丸文的笔记【NTT,多项式求逆】
  8. AT3957-[AGC023F]01 on Tree【贪心,堆】
  9. jzoj3084-超级变变变【数学】
  10. P1892-团伙【图论,并查集】