DFS应用——寻找欧拉回路

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wiremock 使用_使用WireMock进行更好的集成测试

wiremock 使用无论您是遵循传统的测试金字塔还是采用诸如“ 测试蜂窝”这样的较新方法,都应该在开发过程中的某个时候开始编写集成测试。 您可以编写多种类型的集成测试。 从持久性测试开始,您可以检查组件之间的交互,也可以模拟调用外部服务…

mysql备份七牛云存储_定时备份 Mysql并上传到七牛的方法

多数应用场景下,我们需要对重要数据进行备份、并放置到一个安全的地方,以备不时之需。常见的 MySQL 数据备份方式有,直接打包复制对应的数据库或表文件(物理备份)、mysqldump 全量逻辑备份、xtrabackup 增量逻辑备份等。常见的数据存储方式有…

jetty java_Jetty,Java和OAuth入门

jetty java使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。 Jetty是一个小型,高度可扩展的基于Java的Web服务器和servlet引擎。 它支持HTTP / 2&#xff0c…

DFS应用——查找强分支

【0】README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 “DFS应用——查找强分支” 的idea 并用源代码加以实现 ; 【1】查找强分支 1.1)如何检测一个图是否是强连通的: 通过执行两…

python中的super用法详解_Python中super函数用法实例分析

本文实例讲述了python中super函数用法。分享给大家供大家参考,具体如下:这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简单说, super函数是调用下一个父类(超类)并返回该父类实例的方法. 这里的下…

java 管理多个进程_管理多个Java安装

java 管理多个进程随着越来越多的Java版本发布,在本地环境中管理多个Java安装将变得更加有趣。 不同的项目可能需要不同的Java版本。 jenv项目是管理Java安装的便捷方法。 它可以在全局,目录和外壳程序级别上设置本地Java安装,并使用易于记忆…

NP-完全性介绍

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff0c; 旨在 理解 “NP-完全性” 的idea &#xff1b; 【1】难与易 1.1&#xff09;不可判定问题&#xff1a;正如实数不足以表示 x^2 < 0 的解那样&#xff0c;可以证明&#xff0c; 计算机不可能解决碰…

python发邮件给多个人发送消息_python发送邮件(带附件)、发送给多人、抄送给多人的示例...

python发送邮件(带附件)、发送给多人、抄送给多人的示例#!/usr/bin/env python# -*-encoding: utf-8 -*-import smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMEText#image包可以发送图片形式的附件# from email.mime.image import MI…

camel apache_Apache Camel 3只有2个月的路程

camel apache骆驼队正忙于为 Apache Camel 3.今天&#xff0c;第二个候选版本已构建并发布在暂存库中&#xff0c;供早期的适配器尝试 。 当我自己很忙的时候&#xff0c;我只想写一篇简短的博客文章&#xff0c;以使社区了解Apache Camel 3即将发布&#xff0c;并且我们希望…

浅谈java代理

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java代理机制 的基础知识&#xff1b; 【1】代理相关 1.1&#xff09;利用代理可以在运行时创建一个实现了一组给定接口的新类&#xff0c; 这种功能只有在 编译时无法确定需要实…

织梦mysql安装教程视频教程_织梦DedeCMSV6系统安装步骤教程

DedeCMSV6系统基于PHP7.*MySQL开发&#xff0c;本篇文档将介绍如何下载DedeCMSV6系统&#xff0c;并且通过之前已经部署好的系统环境来安装配置一个安全的站点。准备工作&#xff1a;主机一台(PHP7.0以上MYSQL)域名(做好解析绑定工作)源码下载通过DedeCMSV6系统下载页面可以获取…

无法创建t的通用数组_创建通用数组的问题

无法创建t的通用数组在这篇文章中&#xff0c;我们将介绍一篇全面的文章&#xff0c;其中介绍了创建通用数组的问题。 Java编程语言于2004年9月在Java 5.0“ Tiger”发行版中添加了泛型。 泛型或类型参数化系统在提供类型安全性的同时扩展了Java现有的类型系统。 1.简介 Java具…

贪婪算法+小应用(调度问题)

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff0c; 旨在 理解 “DFS应用——贪婪算法” 的idea&#xff1b; 【1】贪婪算法 1.1&#xff09;已经看到的三个贪婪算法&#xff1a; Dijkstra算、Prim算法 和 Kruskal 算法&#xff1b;&#xff08;Dijkstr…

http 安全性和幂等性_HTTP方法:幂等性和安全性

http 安全性和幂等性幂等性和安全性是HTTP方法的属性。 HTTP RFC定义了这些属性&#xff0c;并告诉我们哪些HTTP方法是安全且幂等的。 服务器应用程序应确保正确执行安全和幂等的语义&#xff0c;如客户端期望的那样。 安全的HTTP方法 如果HTTP方法不更改服务器状态&#xff0…

Huffman编码(Huffman树)

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff0c; 源代码均为原创&#xff0c; 旨在 理解 “Huffman编码&#xff08;Huffman树&#xff09;” 的idea 并用源代码加以实现&#xff1b; 0.2&#xff09; Huffman树的构建算法属于 贪婪算法&#xff0c;…

java获取文件列表_java获取指定目录中的文件列表

最近项目中会动态生成文件html及相关资源文件(css,js,png,mp3)&#xff0c;为了防止文件名重复&#xff0c;需要获取目录中相同类型文件的最大编号&#xff0c;下面我用代码来实现获得文件列表。public static void getFiles(String path) {File file new File(path);// 如果这…

jep290涉及jdk版本_针对JDK 14提议的另外六个JEP

jep290涉及jdk版本Mark Reinhold最近的消息宣布了六个新的“建议针对JDK 14的JEP ”&#xff1a; JEP 345 &#xff0c; JEP 361 &#xff0c; JEP 363 &#xff0c; JEP 364 &#xff0c; JEP 365和JEP 367 。 假设没有异议由11月7日提出&#xff0c;这些JEPs将有针对性地JDK …

近似装箱问题(三种联机算法实现)

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff0c; 源代码均为原创&#xff0c; 旨在 理解 “近似装箱问题&#xff08;三种联机算法实现&#xff09;” 的idea 并用源代码加以实现&#xff1b; 0.2&#xff09; 近似装箱问题的三种联机算法 分别是&am…

java 随机数种子_Java--随机数和随机数种子(转)

在计算机中并没有一个真正的随机数发生器&#xff0c;但是可以做到使产生的数字重复率很低&#xff0c;这样看起来好象是真正的随机数&#xff0c;实现这一功能的程序叫伪随机数发生器。有关如何产生随机数的理论有许多&#xff0c;如果要详细地讨论&#xff0c;需要厚厚的一本…

java 堆转储快照_捕获Java堆转储的7个选项

java 堆转储快照堆转储是诊断与内存相关的问题的重要工件&#xff0c;例如内存泄漏缓慢&#xff0c;垃圾回收问题和java.lang.OutOfMemoryError。它们也是优化内存消耗的重要工件。 有很棒的工具&#xff0c;例如Eclipse MAT和Heap Hero&#xff0c;可以分析堆转储。 但是&…