文章目录

  • 前言
  • 欧拉环游
  • Fleury算法
  • 中国邮递员问题

前言

这篇文章介绍了欧拉环游的定义判定,Fleury算法求欧拉图中的欧拉环游,最后给出了中国邮递员问题的解决步骤。

欧拉环游

所谓欧拉环游就是指在一个无向图中,从一个点出发,每条边恰好走一次并且能够回到原点的路径。举个例子,下图中路径ABCD就是一个欧拉环游。这种包含了欧拉环游的图叫欧拉图。

图1 一个欧拉图

那么,给定一个图,我们应该怎么判定它是否是欧拉图呢?很简单。
非空连接图G是欧拉图⇔所有顶点的度为偶数\color{red}非空连接图G是欧拉图\Leftrightarrow所有顶点的度为偶数非空连接图G是欧拉图⇔所有顶点的度为偶数。这里不作证明。

Fleury算法

那么给定一个欧拉图,我们应该如何求欧拉环游呢?这里有一种Fleury算法,可以求解。Fleury算法很简单,简单概括就是过河拆桥,尽量不走独木桥

算法流程:

  1. 任取一个顶点v0v_0v0​,令w0=v0w_0 = v_0w0​=v0​

  1. 路wi=v0e1v1...eiviw_i = v_0e_1v_1...e_iv_iwi​=v0​e1​v1​...ei​vi​已经确定,在图中拆除路中出现的边,选择一条边ei+1e_{i+1}ei+1​使得

    • 边ei+1和vi边e_{i+1}和v_i边ei+1​和vi​相连
    • 除非无奈,否则不要图的割边eie_iei​(除去这条边后图会变成两个不连通的图)

  1. 如果选不出ei+1e_{i+1}ei+1​,结束。否则得到路wi+1=v0e1v1...eiviwi+1vi+1w_{i+1 }= v_0e_1v_1...e_iv_iw_{i+1}v_{i+1}wi+1​=v0​e1​v1​...ei​vi​wi+1​vi+1​,ei+1e_{i+1}ei+1​连接viv_ivi​和vi+1v_{i+1}vi+1​,转到2。

算法复杂度:
设顶点个数为vvv,边数为ϵ\epsilonϵ,那么算法复杂度为O(v2ϵ)O(v^2\epsilon)O(v2ϵ)遍历每条边,并且判断这条边是否为割边,判断一条边是否为割边复杂度为O(v2)O(v^2)O(v2),所以该算法的算法复杂度为O(v2ϵ)O(v^2\epsilon)O(v2ϵ)

算法图解:

图2 算法图解

中国邮递员问题

讲了半天欧拉环游,接下来我们讲讲它的使用例子。我国数学家管梅谷中国邮递员问题(Chinese postman problem, cpp)。一个邮递员从邮局出发,走完所有他所管辖街道各一次,最后返回邮局,如何选择一条最短路线。这是个求最优环游问题(遍历所有边回到原点并且边权重和最小),我们可以把这个问题转换为欧拉环游问题。

  • 假如图G是欧拉图,那么图G任意欧拉环游都是最优环游
  • 假如图G不是欧拉图,则某些边必须被多次经过。我们可以将这条边多复制几条,变成多重边。这样中国邮递员就与下面问题等价。
  1. 添加重复边,从原来的图中生成欧拉图,并且使得添加的边权重和最小。
  2. 求欧拉环游。

管梅谷证明,一条边最多被重复走两次。

这里直接给出求解中国邮递员问题的步骤:

  1. 找出图GGG中邻接边为奇数的顶点,将这些邻接边为奇数顶点两两配对,将连通两者的路径上面的边都改为加上一条重复边。
  2. 若某对结点间有多于两条边连接,则去掉其中偶数条边,留下一条或两条边连接这两个结点,直到每对相邻结点至多由2条边连接。
  3. 检查每个圈CCC,若某个圈CCC上重复边集EEE的权和超过这个圈的权和的一半,则将CCC中原来的重复边去除,将原来的没有重复边的边加上重复边,直到所有的圈其重复边的权和不超过此圈权和的一半
  4. 用Fleury算法求欧拉回路。

参考视频
算法图解

图3 中国邮递员算法图解

欧拉环游和中国邮递员问题相关推荐

  1. 欧拉路径(欧拉环游、欧拉回路)

    一个流行的游戏是用铅笔画这些图,但是图中的每一条边都只能被画一次,在画图过程中铅笔不能离开纸面.难度更高的问题是,不光要一笔画完图,并且起点和终点还要落在同一处.如果我们将上面的三个图形都看作图数据结 ...

  2. Fleury算法找欧拉环游

    算法思路 任意选择一个顶点v0v0v_0, 假设已经确定好了前面的路径了.在剩下的边中选一个新的边 这个新的边需要跟它前面的那个点要相关联 除非没有点可以选,否则不能是剩余子图的割边. 一直到等这个步 ...

  3. fleury求欧拉环游算法 matlab,Fleury算法求欧拉路径

    分析: 小Ho:这种简单的谜题就交给我吧! 小Hi:真的没问题么? <10分钟过去> 小Ho:啊啊啊啊啊!搞不定啊!!!骨牌数量一多就乱了. 小Hi:哎,我就知道你会遇到问题. 小Ho:小 ...

  4. poj2154-color-polyan次二面体+欧拉函数优化

    N<=1e9,O(nlogn)的做法会超时.从枚举置换转变为枚举轮换长度,然后可以利用欧拉函数,把复杂度变为O(√n * logn) 1 /*-------------------------- ...

  5. BZOJ 2818 Gcd 线性欧拉筛(Eratosthenes银幕)

    标题效果:定整N(N <= 1e7),乞讨1<=x,y<=N和Gcd(x,y)素数的数(x,y)有多少.. 思考:推,. 建立gcd(x,y) = p,然后,x / p与y / p互 ...

  6. hdu 1286( 欧拉函数 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1286 数学题真的是有点吃不消了... View Code 1 #include<iostream ...

  7. 欧拉、欧几里得、笛卡尔都没能解决的数学问题,他探索了新的方案

    萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 欧拉.欧几里得.笛卡尔.尼科马修斯都没能解决的千年数学问题,还有破解的可能吗? 还真有可能. 最近,一位名为佩斯·尼尔森 (Pace Nie ...

  8. 费马定理中值定理_数论-欧拉函数、欧拉定理

    欧拉函数 积性函数 满足 ( 互质) 定义 对于正整数 ,欧拉函数是小于等于 的所有数中与 互质的数的 个数. 欧拉函数是积性函数(这个证明不是很显然,这个链接里面有很多种证明方法) 记作: 公式 , ...

  9. poj2154(Polya+欧拉函数优化模版)

    #include <cstdio> #include <cstring> #include<iostream> using namespace std; const ...

  10. 欧拉筛 筛法求素数 及其例题 时间复杂度O(n)

    埃式筛法尽管不错,但是确实做了许多无用功,某个数可能会被重复的筛好几次,欧拉筛解决了这个方法,下面为代码: 注意理解if(i%prim[j]==0) break; 大佬讲的不错的博客,我就不做复读机了 ...

最新文章

  1. 修复错误配置fstab文件导致系统无法正常启动
  2. C#中汉字数字、汉字拼音的转换
  3. acer清理工具 clear下载_时秋极致清理大师app下载安装_时秋极致清理大师软件最新版免费下载...
  4. 数据中心机房的监控系统是否重要?
  5. 设置联想电脑双屏显示(备用待查)
  6. ubuntu16.04下载caffe(CPU版本)及部分文件说明
  7. 第二个情人节表白网页源码
  8. SpringBoot 配置文件(yml)
  9. 重新学习java第一天
  10. 格式化信息窗口内容—ArcGIS API for JavaScript
  11. 分享最新win7旗舰版/专业版企业版激活密钥和激活方法哦
  12. 人工智能与计算机发展史
  13. 微博商业数据挖掘方法
  14. 页面交换文件pagefile.sys-虚拟内存页面文件
  15. Flutter tween动画
  16. 关于巨杉数据库的学习
  17. android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android) .
  18. 全网最全编程学习网站汇总来了,还不赶快收藏
  19. 渗透学习日记day7
  20. java生成二维码,全过程,不要积分

热门文章

  1. 金山文字应用技巧两则(转)
  2. android云控开源,Android EasyClient 云台控制开源流媒体摄像机EasyCamera
  3. 计算机二级方案管理器,计算机二级考试真题-Word-学生成绩管理系统需求分析
  4. VBA常用实例 | OUTLOOK批量下载选中邮件中的附件
  5. SQL数据库学习总结
  6. 软件维护集成价格估算
  7. 布料仿真先导2-带阻尼的单个小球单摆下的拉格朗日方程列些和matlab仿真
  8. Rational Rose—概述
  9. 笔记本摄像头频闪频灭
  10. 零基础CSS入门教程(29)–CSS下拉菜单实例