欧拉环游和中国邮递员问题
文章目录
- 前言
- 欧拉环游
- Fleury算法
- 中国邮递员问题
前言
这篇文章介绍了欧拉环游的定义判定,Fleury算法求欧拉图中的欧拉环游,最后给出了中国邮递员问题的解决步骤。
欧拉环游
所谓欧拉环游就是指在一个无向图中,从一个点出发,每条边恰好走一次并且能够回到原点的路径。举个例子,下图中路径ABCD就是一个欧拉环游。这种包含了欧拉环游的图叫欧拉图。
图1 一个欧拉图 |
那么,给定一个图,我们应该怎么判定它是否是欧拉图呢?很简单。
非空连接图G是欧拉图⇔所有顶点的度为偶数\color{red}非空连接图G是欧拉图\Leftrightarrow所有顶点的度为偶数非空连接图G是欧拉图⇔所有顶点的度为偶数。这里不作证明。
Fleury算法
那么给定一个欧拉图,我们应该如何求欧拉环游呢?这里有一种Fleury算法,可以求解。Fleury算法很简单,简单概括就是过河拆桥,尽量不走独木桥
算法流程:
- 任取一个顶点v0v_0v0,令w0=v0w_0 = v_0w0=v0
- 路wi=v0e1v1...eiviw_i = v_0e_1v_1...e_iv_iwi=v0e1v1...eivi已经确定,在图中拆除路中出现的边,选择一条边ei+1e_{i+1}ei+1使得
- 边ei+1和vi边e_{i+1}和v_i边ei+1和vi相连
- 除非无奈,否则不要图的割边eie_iei(除去这条边后图会变成两个不连通的图)
- 如果选不出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=v0e1v1...eiviwi+1vi+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不是欧拉图,则某些边必须被多次经过。我们可以将这条边多复制几条,变成多重边。这样中国邮递员就与下面问题等价。
- 添加重复边,从原来的图中生成欧拉图,并且使得添加的边权重和最小。
- 求欧拉环游。
管梅谷证明,一条边最多被重复走两次。
这里直接给出求解中国邮递员问题的步骤:
- 找出图GGG中邻接边为奇数的顶点,将这些邻接边为奇数顶点两两配对,将连通两者的路径上面的边都改为加上一条重复边。
- 若某对结点间有多于两条边连接,则去掉其中偶数条边,留下一条或两条边连接这两个结点,直到每对相邻结点至多由2条边连接。
- 检查每个圈CCC,若某个圈CCC上重复边集EEE的权和超过这个圈的权和的一半,则将CCC中原来的重复边去除,将原来的没有重复边的边加上重复边,直到所有的圈其重复边的权和不超过此圈权和的一半
- 用Fleury算法求欧拉回路。
参考视频
算法图解
图3 中国邮递员算法图解 |
欧拉环游和中国邮递员问题相关推荐
- 欧拉路径(欧拉环游、欧拉回路)
一个流行的游戏是用铅笔画这些图,但是图中的每一条边都只能被画一次,在画图过程中铅笔不能离开纸面.难度更高的问题是,不光要一笔画完图,并且起点和终点还要落在同一处.如果我们将上面的三个图形都看作图数据结 ...
- Fleury算法找欧拉环游
算法思路 任意选择一个顶点v0v0v_0, 假设已经确定好了前面的路径了.在剩下的边中选一个新的边 这个新的边需要跟它前面的那个点要相关联 除非没有点可以选,否则不能是剩余子图的割边. 一直到等这个步 ...
- fleury求欧拉环游算法 matlab,Fleury算法求欧拉路径
分析: 小Ho:这种简单的谜题就交给我吧! 小Hi:真的没问题么? <10分钟过去> 小Ho:啊啊啊啊啊!搞不定啊!!!骨牌数量一多就乱了. 小Hi:哎,我就知道你会遇到问题. 小Ho:小 ...
- poj2154-color-polyan次二面体+欧拉函数优化
N<=1e9,O(nlogn)的做法会超时.从枚举置换转变为枚举轮换长度,然后可以利用欧拉函数,把复杂度变为O(√n * logn) 1 /*-------------------------- ...
- BZOJ 2818 Gcd 线性欧拉筛(Eratosthenes银幕)
标题效果:定整N(N <= 1e7),乞讨1<=x,y<=N和Gcd(x,y)素数的数(x,y)有多少.. 思考:推,. 建立gcd(x,y) = p,然后,x / p与y / p互 ...
- hdu 1286( 欧拉函数 )
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1286 数学题真的是有点吃不消了... View Code 1 #include<iostream ...
- 欧拉、欧几里得、笛卡尔都没能解决的数学问题,他探索了新的方案
萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 欧拉.欧几里得.笛卡尔.尼科马修斯都没能解决的千年数学问题,还有破解的可能吗? 还真有可能. 最近,一位名为佩斯·尼尔森 (Pace Nie ...
- 费马定理中值定理_数论-欧拉函数、欧拉定理
欧拉函数 积性函数 满足 ( 互质) 定义 对于正整数 ,欧拉函数是小于等于 的所有数中与 互质的数的 个数. 欧拉函数是积性函数(这个证明不是很显然,这个链接里面有很多种证明方法) 记作: 公式 , ...
- poj2154(Polya+欧拉函数优化模版)
#include <cstdio> #include <cstring> #include<iostream> using namespace std; const ...
- 欧拉筛 筛法求素数 及其例题 时间复杂度O(n)
埃式筛法尽管不错,但是确实做了许多无用功,某个数可能会被重复的筛好几次,欧拉筛解决了这个方法,下面为代码: 注意理解if(i%prim[j]==0) break; 大佬讲的不错的博客,我就不做复读机了 ...
最新文章
- 修复错误配置fstab文件导致系统无法正常启动
- C#中汉字数字、汉字拼音的转换
- acer清理工具 clear下载_时秋极致清理大师app下载安装_时秋极致清理大师软件最新版免费下载...
- 数据中心机房的监控系统是否重要?
- 设置联想电脑双屏显示(备用待查)
- ubuntu16.04下载caffe(CPU版本)及部分文件说明
- 第二个情人节表白网页源码
- SpringBoot 配置文件(yml)
- 重新学习java第一天
- 格式化信息窗口内容—ArcGIS API for JavaScript
- 分享最新win7旗舰版/专业版企业版激活密钥和激活方法哦
- 人工智能与计算机发展史
- 微博商业数据挖掘方法
- 页面交换文件pagefile.sys-虚拟内存页面文件
- Flutter tween动画
- 关于巨杉数据库的学习
- android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android) .
- 全网最全编程学习网站汇总来了,还不赶快收藏
- 渗透学习日记day7
- java生成二维码,全过程,不要积分