关于前面的树的学习已经告一段落了,从这一篇起我们要开始新的征程——图的学习,但在正式学习图之前,我们先来了解一个有趣的,关于图的问题:哥尼斯堡七桥问题。

1. 哥尼斯堡七桥问题


图1

  在18世纪初普鲁士的哥尼斯堡小镇上有一条河穿过,河上有两个小岛,有七座桥把两个岛与河岸联系起来。

  于是有人提出问题:一个步行者怎样才能不重复,不遗漏地一次走完七座桥,最后回到出发点 。

  这个问题提出后,引发了很多人的兴趣,于是小镇上的居民开始思考这个问题,进行试验,但是在之后很长的一段时间里,这个问题一直都没有得到解决。

  其实对于这个问题,利用普通数学知识,每座桥均走一次,那这七座桥所有的走法一共有5040种,如果每种走法都走一遍的话需要花费很长时间,但怎么才能找到成功走过每座桥而不重复的路线呢?因而形成了著名的“哥尼斯堡七桥问题”。

  于是就有学生给天才数学家欧拉写信,请他帮忙解决这一问题。1736年,在经过一年的研究之后,29岁的欧拉提交了《哥尼斯堡七桥》的论文,圆满解决了这一问题,同时开创了数学新一分支 ——— 图论(图论不光有在计算机中应用,而且在其他学科中也有着广泛的应用,向伟大的欧拉数学家致敬!)。

2. 欧拉解题路线


图2

  欧拉将哥尼斯堡七桥问题抽象出来,把每一块陆地考虑成一个点,连接两块陆地的桥以线表示,用A、B、C、D四个点表示为哥尼斯堡的四个区域,并由此得到了如图一样的几何图形,然后再进行形式化定义。

  欧拉在根据上面的几何图形的图性质,解决哥尼斯堡七桥问题的结论是这样的: 如果通奇数桥(七座桥是奇数桥)的地方多于两个,则不存在欧拉回路; 如果只有两个地方通奇数桥,可以从这两个地方之一出发,找到欧拉回路;如果没有一个地方通奇数桥,则无论从哪里出发,都能找到欧拉回路。结论:通奇数桥的地方为0个或2个,有欧拉回路

  比如在上图中连接A的路线有5条,连接B的路线有3条,连接C和D的路线也有3条。所以通奇数桥的地方不是0个,也不是2个,是没有欧拉回路的,因此欧拉根据这样的性质得出:没有任何一种走法可以从某地出发,不遗漏地一次走完七座桥,再回到原点。也就是说,这个问题无解。

3. 用计算机求解图问题

  其实对于哥尼斯堡七桥问题,我们可以依次计算图中与每个节点相关联的边的个数(节点的度),根据度为奇数的节点个数判定是否存在欧拉回路。

数据表示——数据结构:
  设邻接矩阵arc[n][n]这样的存储结构来描述图中每个点的桥的个数(边的个数)


图3

在邻接矩阵中:

第1行第1列的0代表A到A的边的个数为0
第1行第2列的2代表A到B的边的个数为2
第1行第3列的2代表A到C的边的个数为2
第1行第4列的1代表A到D的边的个数为1
第2行第1列的2代表B到A的边的个数为2
第2行第2列的0代表B到B的边的个数为0
第2行第3列的0代表B到C的边的个数为0
第2行第4列的1代表B到D的边的个数为1
第三行,以此类推……
第四行,以此类推……

数据处理——算法:
1. 通奇数桥的顶点个数count初始化为0;
2. 下标 i 从0 ~ n – 1重复执行下述操作:
  2.1 计算矩阵arc[n][n]第i行元素之和degree;
  2.2 如果degree为奇数,则count++;
3. 如果count等于0或2,则存在欧拉回路;否则不存在欧拉回路;

算法实现:

int main(void)
{//邻接矩阵arcchar ch = 'A';int arc[4][4] = {               {0,2,2,1},{2,0,0,1},{2,0,0,1},{1,1,1,0}};int count = 0;int i;int j;int degree = 0;for(i = 0; i < 4; i++){//计算矩阵arc[n][n]第i行元素之和degreefor(j = 0; j < 4; j++){degree += arc[i][j];}printf("%c点的度为:%d\n" ,  ch++, degree);//如果degree为奇数,则count++if(degree % 2 == 1){count++;}degree = 0;}//如果count等于0或2,则存在欧拉回路;否则不存在欧拉回路if(count == 0 || count == 2){printf("存在欧拉回路\n");}else{printf("不存在欧拉回路\n");}return 0;
}

测试结果:

  在这一篇中我们简单介绍了哥尼斯堡七桥问题,以及用计算机求解图问题,而这也是我们接下来要学习的数据结构——图。

49-从哥尼斯堡七桥问题开始相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. 案例6-1.3 哥尼斯堡的“七桥问题”

    题目 可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707-1783)最终解决了这个问题,并由此创立了拓扑学.这个问题如今可以描述为判断欧拉回路是否存在的问 ...

最新文章

  1. javascript里的偏函数——本质函数式编程+闭包,返回函数
  2. U3D SCENEMANAGER.LOADSCENE是半异步的
  3. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明) Cities(区间dp)
  4. 在中断程序里修改全局变量的童鞋注意啦~(C中的volatile作用 转载~)
  5. python去重复功能_python包中的statmodels,如何处理完全重复的功能?
  6. CF719E. Sasha and Array [线段树维护矩阵]
  7. Java equalsIgnoreCase() 方法
  8. 经典:趣解什么叫网关?
  9. celery 停止任务_Celery 周期任务运行一段时间后意外停止
  10. 【Codeforces 1051D】Bicolorings
  11. 视频抠图在线工具有哪些?推荐这3款AI智能抠图工具
  12. NB-IoT 基于蜂窝的窄带物联网
  13. 蓝色简洁的企业cms网站权限后台管理模板——后台
  14. 基于Vue.js模拟酒店预订移动App
  15. IDEA双击不报错打不开解决方法
  16. html5 application cache 空间限制,HTML5离线存储之Application Cache
  17. yyyy/mm/dd变成yyyy-mm-dd
  18. python 条形图填充疏密_可视化库-Matplotlib-条形图(第四天)
  19. 三参数或七参数计算工具使用帮助
  20. Android缺陷分析:cnss-daemo进程崩溃

热门文章

  1. Windbg的获取与安装教程
  2. pytorch模型转mxnet
  3. css字体超出显示点点点
  4. 登录邮箱手动连接服务器,outlook2016不能连接exchange2010,自动或手动均不能连接服务器...
  5. 关于windows虚拟桌面使用及录屏
  6. 1.1股票数据预处理练习
  7. wav转mp3的最简单方法
  8. Cocoa与Cocoa Touch区别
  9. C# Winform 使用 PuppeteerSharp 进行网页截图、生成pdf等操作
  10. 深度残差网络+自适应参数化ReLU激活函数:调参记录17