柯尼斯堡七桥问题

大数学家欧拉一生中的大部分时间在俄国和普鲁士度过。1735年,他提出了著名的柯尼斯堡七桥(Seven Bridges of Königsberg)问题:

柯尼斯堡(今俄罗斯加里宁格勒)的市区横跨普雷格尔河两岸,河中心有两个小岛,小岛与河的两岸有七座桥连接。在所有桥都只能走一遍的前提下,如何才能把这个地方所有的桥都走遍?

当时欧拉并没有找到这个问题的解。第二年,他证明了不存在符合条件的走法。在论文中,欧拉将柯尼斯堡的实际情况抽象成了二维空间上点与线的组合,桥可以视为线(边),桥连接的陆地视为点(顶点)——这就是数学中图论思维的起源。

如上,柯尼斯堡七桥问题就被推广为“一笔画”问题:

对于一个给定的图,怎样判断是否存在一个恰好包含了所有的边,并且没有重复边的路径?

背景铺垫完了,下面介绍相关的概念和定理。

欧拉图、欧拉路径/回路

在图论中:

  • 如果在一张图(有向图或无向图)上能够不重复地遍历完所有的边,那么此图就称为欧拉图(Eulerian graph)。
  • 能够不重复地遍历完所有的边的路径——即一笔画的“笔画”,称为欧拉路径(Eulerian path)。
  • 特别地,如果上述路径的起点与终点相同,则称为欧拉回路(Eulerian circuit)。

如下gif所示的图就是欧拉图,存在一个欧拉路径。

下图是一笔画成的“串”字,也就是说烧烤店门口挂的这个字可以用单条LED灯带做成。

那么柯尼斯堡七桥问题为什么不能“一笔画”呢?来看看欧拉提出的定理。

图论中的欧拉定理(一笔画定理)

欧拉同时考虑到了有向图与无向图的情况,因此要分别讨论。

无向图的情况

定理:

连通无向图G有欧拉路径的充要条件为:G中奇度顶点(即与其相连的边数目为奇数的顶点)有0个或者2个。

证明:

  • 必要性
    如果图能够被一笔画成,那么对每个顶点,考虑路径中“进入”它的边数与“离开”它的边数[注意前提是无向图,所以我们不能称其为“入边”和“出边”]。很显然这两个值要么相同(说明该顶点度数为偶),要么相差1(说明该顶点度数为奇)。
    也就是说,如果欧拉路径不是回路,奇度顶点就有2个,即路径的起点和终点;如果是欧拉回路,起点与终点重合,则不存在奇度顶点。必要性得证。

  • 充分性

    • 如果图中没有奇度顶点,那么在G中随机取一个顶点v0出发,尝试构造一条回路c0。如果c0就是原图,则结束;如果不是,那么由于图是连通的,c0和图的剩余部分必然存在某公共顶点v1,从v1出发重复尝试构造回路,最终可将整张图分割为多个回路。由于两条相连的回路可以视为一条回路,所以该图必存在欧拉回路。
    • 如果图中有2个奇度顶点u和v,那么若是加一条边将u和v连接起来的话,就得到一个没有奇度顶点的连通图,由上文可知该图必存在欧拉回路,去掉这条新加的边,就是一条以u和v为起终点的欧拉路径。充分性得证。

可知,柯尼斯堡七桥问题中的图有4个奇度顶点(1个度数为5,3个度数为3),所以不存在欧拉路径。

有向图的情况

定理:

底图连通的有向图G有欧拉路径的充要条件为:G的所有顶点入度和出度都相等;或者只有两个顶点的入度和出度不相等,且其中一个顶点的出度与入度之差为1,另一个顶点的入度与出度之差为1。

显然,可以通过与无向图情况相似的思路来证明,过程略去。

欧拉定理介绍完了,那么如何找到具体的路径呢?

寻找欧拉路径/回路——套圈法

首先,我们当然要判断图的连通性,非连通图是不存在欧拉路径/回路的。判断图的连通性可以通过传统的DFS和BFS方法,也可以通过之前讲过的并查集实现,另外还有基于传递闭包的Floyd-Warshall算法(没错就是求最短路的那个),不再赘述。

如果图是连通的,我们再遍历每个顶点的度(有向图就是入度和出度),根据欧拉定理即可轻松地判断图中是否欧拉路径/回路。如果是欧拉路径的话,还能顺便找出路径的起点和终点。

接下来,我们通过俗称“套圈法”的DFS思路来寻找欧拉路径/回路。

参考欧拉定理充分性的证明过程,欧拉图可以分割为多个相交的回路,所以我们可以从起点开始,通过DFS逐渐扩展路径,并标记边已经被遍历过(根据定义,已经被标记了的边之后就不会再走),直到形成一个回路。然后回溯到上一个有边没被遍历到的顶点——就是上文说的“c0和图的剩余部分必然存在某公共顶点v1”,以它为起点重复同样的操作,直到所有回路都被找出来。在回溯阶段所记录的路径就是所求的欧拉路径/回路。

听起来似乎有些混乱,来看一道例题吧。

例题——POJ 2337 «Catenyms»

传送门见这里。

题目大意:给定N个单词,要求把这些单词不重复地排成一个序列,使每个单词的首字母与前一个单词的末尾字母相同(e.g. aloha.aloha.arachnid.dog.gopher.rat.tiger),以点号分隔输出。如果存在不止一个解,输出字典序最小的那个序列。如果没有解,输出三个星号。

我们可以将每个单词的两端视为顶点,单词本身视为有向边,就能构造出有向图。先判断连通性,再判断是否存在欧拉路径/回路(同时找出起点),最后用套圈法找出具体的路径——由于DFS回溯得到的路径是倒序的,所以把它们放在栈中记录比较方便。

本题需要特别注意的点在于输出字典序最小的那个序列,因此先要将所有单词按字典序排序。另外,如果存在的是欧拉回路,那么得选择字典序最小的单词作为起点。

今天时间不太够了,AC代码之后再补上,看官可参考其他大佬的代码,或移步Discuss区。

The End

寻找欧拉路径/回路也可以使用Fleury算法,但是它要额外检测图中的桥边,相比DFS而言不太容易操作。看官可以参考图论或离散数学教材获取更多细节。

民那晚安。


http://www.taodudu.cc/news/show-3262768.html

相关文章:

  • courant数_柯朗数(Courant number)研究
  • 什么是柯理化函数
  • 移柯L505 OPENCPU的准备
  • 简单理解 柯理化函数
  • 特殊分布律篇4——瑞利分布
  • 解释瑞利分布的平方、莱斯分布的平方、高斯分布的平方 服从什么分布?
  • Python Numpy random.rayleigh() 瑞利分布
  • 瑞利分布与莱斯分布仿真
  • 产生瑞利分布的随机数 C语言实现
  • 瑞利分布,对数正态分布,韦布尔分布,K分布参数极大似然估计的MATLAB实现
  • 随机过程笔记(9) 瑞利分布和窄带高斯
  • 统计信号处理小作业——瑞利分布噪声中确定性直流信号的检测
  • 概率论与数理统计复习一(伽马函数、正态分布、瑞利分布、线性相关、独立)
  • 瑞利分布随机变量产生MATLAB,运用直接抽样法产生指数分布、瑞利分布的随机变量序列matlab编程.doc...
  • 瑞利分布随机变量产生MATLAB,运用直接抽样法产生指数分布、瑞利分布的随机变量序列matlab编程...
  • R语言绘制瑞利分布和指数分布,并为瑞利分布着不同色
  • matlab仿真瑞利分布与高斯分布
  • 瑞利分布与卡方分布的联系
  • 瑞利分布、莱斯分布与窄带过程
  • 一文搞懂均匀分布、高斯分布、瑞利分布、莱斯分布(含MATLAB代码)
  • go cap和len的区别
  • ERROR 1406 (22001): Data Too Long, field len 30, data len 48
  • python之__len__()
  • GoLang之内置len、cap函数
  • python中len和range函数_Python中len()和range()函数
  • python中len的用法_总结Python中len()函数的使用实例
  • Python的len()函数
  • python中len用法_【python】python中len()怎么用-百度经验
  • python中len用法_Python Pandas Series.str.len()用法及代码示例
  • c语言中len的作用,C语言 int len( )  求大神解释

图论的起源:柯尼斯堡七桥(一笔画)问题与欧拉路径/回路相关推荐

  1. 七桥问题在计算机领域的应用,哥尼斯堡七桥问题在高考中应用

    摘 要:在数学教学和学习过程中把抽象.概括和具体化结合起来是非常重要的.哥尼斯堡七桥问题就是很好的一个例子. 关键词:哥尼斯堡七桥 一笔画 抽象 18世纪,东普鲁士哥尼斯堡有条普莱格尔河,这条河有两个 ...

  2. 图解图论介绍及应用(1):哥尼斯堡七桥

    点击上方"AI公园",关注公众号,选择加"星标"或"置顶" 作者:Vardan Grigoryan 编译:ronghuaiyang 导读 知 ...

  3. 图论入门六:哥尼斯堡七桥问题

    转载自https://blog.csdn.net/saltriver/article/details/54585595 哥尼斯堡七桥问题: 1736年,年仅29岁的数学家欧拉来到普鲁士的古城哥尼斯堡( ...

  4. 哥尼斯堡七桥问题用计算机,哥尼斯堡七桥问题解法真的解不出来?请尽快解答.急...

    十八世纪,东普鲁士的首府哥尼斯堡是一座景色迷人的城市,普莱格尔河横贯城区,使这 座城市锦上添花,显得更加风光旖旋.这条河有两条支流,在城中心汇成大河,在河的 中央有一座美丽的小岛.河上有七座各具特色的 ...

  5. 欧拉如何解决哥尼斯堡七桥问题(二)

    上一讲欧拉已经证明哥尼斯堡七桥问题不存在每座桥只走一次的走法.但是这里有一个特殊情况,即A.B.C.D每个地区恰巧都有奇数个桥连通.欧拉当然也想到了如果存在偶数桥,及任意数量的河和桥图是否存在每座桥只 ...

  6. 世界数学难题——哥尼斯堡七桥问题 哥尼斯堡七桥问题

    七桥问题 七桥问题Seven Bridges Problem 18世纪著名古典数学问题之一.在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来(如图).问是否可能从这四块陆地中任一 ...

  7. 欧拉如何解决哥尼斯堡七桥问题(一)

    解决问题的方法有两种,一种是学习并利用他人的研究成果去解决一些问题,一种是通过自己思考发现 问题的解决方法并解决问题.最近我国被各种卡脖子的问题所困扰,毫不客气的说我们解决大部分问题都是 采用第一种, ...

  8. 哥尼斯堡七桥——Euler欧拉定理证明

    昨天和同学复习图论,深入讨论了欧拉定理,有了相对透彻的理解,我希望写下来,我的博客就是我的笔记本,记录学习的点点滴滴而已. 定理5.1   设G为非空连通图,则G为 Euler图  <=> ...

  9. 图论:柯尼斯堡桥问题、艾科西亚游戏

    图论是与线连接的点的网络有关的数学分支.的主题图论起源于休闲数学问题(参见 数字游戏),但它已发展成为数学研究的重要领域,并应用于化学,运筹学,社会科学和计算机科学. 图论的历史可以追溯到1735年, ...

最新文章

  1. 替换元素和非替换元素的学习
  2. MIT无人车新突破:不需要地图也能在“乡野小道”上自动行驶
  3. 自己动手做一个小Linux-2
  4. 关于嵌入式开发,到底需要会多少门语言,做好准备了吗
  5. python培训好学吗-python难学吗?为什么上了python培训还是学不会?
  6. Windows 2000配置Web服务器
  7. linux 产生0~100内的随机数
  8. 页面复杂对象传递参数 开发中遇到的问题
  9. 【渝粤题库】国家开放大学2021春1258房屋建筑混凝土结构设计题目
  10. 序列化对象C++对象的JSON序列化与反序列化探索
  11. php验证密码后跳转_php-laravel框架用户验证(Auth)模块解析(四)忘记密码
  12. html制作幸运抽奖,基于canvas的jQuery幸运抽奖大轮盘插件
  13. [qq机器人]nonebot2 群管插件2.0
  14. Win7启动慢,元凶竟是闲置eSATA接口,快下补丁
  15. 解读《西厢记》——基于人脑的句法分析
  16. webview造成窗体泄漏
  17. 服务器系统盘如何克隆,如果把云服务器系统盘克隆
  18. Nakagami分布
  19. Java学习之路---对象篇(Object)
  20. 剪辑技巧!如何利用背景图片给多段视频画面四周添加黑色边框

热门文章

  1. 穿梭在文字间的流浪者
  2. 基于MISRA-C和VS Code的代码静态检查的开源解决方案
  3. 微信小程序里引入SVG矢量图标
  4. 如何设置计算机默认显卡,如何设置默认显卡
  5. GRS认证现场稽核之范围与目的
  6. 如何解决Intel SCS Can not create AD AMT Object error
  7. 朗强科技:KVM延长器怎么连接?KVM延长器怎么用图解
  8. 【过关斩将】2020年互联网公司运维岗位面试题 -技能篇01
  9. 群晖 python_利用群晖Docker安装ubuntu16.04搭建python网站服务器(安装篇)
  10. css语言中选项是背景图像的属性,HTML_学习CSS的背景图像属性background,CSS的背景属性“background”提供 - phpStudy...