关于一笔画问题的一些思考(欧拉路Fleury算法、逐步插入回路法、以及另一种可能的解法)

news2024/11/6 3:14:46

前言

这是一个经典的图论问题了

最近复习离散的时候又恰好看到了,发现自己以前的解法似乎有点bug

然后开始出反例卡自己,结果发现卡不掉?

然后再好好想了想,发现这个看起来有问题的做法可能确实没问题。

注意:欧拉路、欧拉回路、欧拉图、半欧拉图四个概念的区别

Fleury算法

这是离散数学书上的经典求解欧拉路的算法之一

非常好理解,只不过如何快速判断正在删边的图的桥实现起来比较麻烦,如果没有好的数据结构的支持,时间复杂度将会多乘一个(n+m),所以正常情况下我们不用Fleury算法来求解欧拉路

逐步插入回路法

这个方法离散数学书上并没有细讲,而仅仅只用一句话带过了

我们可以先来看看定理15.1(欧拉回路的判定定理)的充分性证明

充分性:G是无向连通图且没有奇度顶点=>G中存在欧拉回路(G是欧拉图)

大致意思就是

(1)G中必定存在圈

书中用可以证明四个字带过了

这个可以用极大路径法证明

因为δ(G)≥2,那么找一条图中的极大路径,路径的端点一定存在一条边连向路径中的点(否则路径就可以继续延长,与极大路径矛盾),这样就会构成一个圈。

(2)删掉这个圈后,剩下的连通分支都是欧拉图(由归纳法假设可得)

(3)以这个大圈上的一点为出发点,走到与删掉后的连通分支上的点后,先把子欧拉回路走完,然后再继续向前走。

证明过程如此,那么如何将其转换为算法呢?

可以利用归纳法的思想,对图G进行分治,先任意找圈,然后删圈,判连通性,在各个连通分支递归,答案返回后再一起整合……反正写起来巨麻烦,而且没必要

另一种可能的解法

为什么说是可能呢,因为我也感觉自己不能很严谨的证明这个做法的正确性

先上代码:

这里省略了对图进行(半)欧拉图判定的过程以及选起始点的过程

只保留了计算的主体部分

可以说是非常诡异,初看时觉得有点道理,细想之后发现完全不对劲,但是它却AC了

于是我开始举反例

8

0 1 1 1 1 0 1 1

1 0 1 0 0 0 0 0

1 1 0 0 0 0 0 0

1 0 0 0 1 1 0 0

1 0 0 1 0 1 0 0

0 0 0 1 1 0 0 0

1 0 0 0 0 0 0 1

1 0 0 0 0 0 1 0

可以发现程序的dfs过程确实时错误的,但是最后输出的结果确实对的

关键就是在于保存答案的位置和输出答案的顺序。

dfs输出的位置是入栈的位置,而保存答案的位置是出栈的位置

Fluery算法告诉我们,我们在做一笔画时出错的原因是,在不必要的时候先走了桥,导致没办法走回来

也就是说,我们应该最后走桥

虽然这个做法中我们并不能保证我们最后走的是桥

但是我们知道

先走桥的肯定会先出栈(因为会走不通,导致退栈回溯)

所以过桥的答案一定会被先统计到

而且最后又是倒序输出,这样就间接地保证了过桥之后的答案最后输出

也就间接地保证了这个做法的正确性。

这个做法是OI中比较普遍的欧拉路求解算法,然而我的这个证明是很不严谨的,希望有识之士可以补充更加严谨的证明。

完结撒花~~~~( •̀ ω •́ )y

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

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

相关文章

透射式光电对管测量脉搏硬件电路设计

目录 前言 一、脉搏测量方法 二、脉搏测量原理 2.1 脉搏信号处理整体电路 2.2 信号采集电路 2.3 信号放大电路 2.4 波形整形电路 总结 前言 脉搏测量仪的设计是通过检测心跳的血液变化,产生不同的反射信号,用传感器将脉搏的跳动转换为电信号&…

Servlet实现表白墙

目录 一、表白墙简介 二、代码实现 1、约定前后端交互的接口 2、后端代码实现 3、前端代码实现 三、效果演示 一、表白墙简介 在表白墙页面中包含三个文本框,分别表示表白者,表白对象,表白内容,在文本框中输入内容之后&…

基于Web Speech API给ChatGPT加上语音功能,距离MOSS又近了一步

目录 前言 起步 实现过程 webkitSpeechRecognition speechSynthesis 小例子 遇到的问题 效果展示 总结 前言 去年写了两篇关于接入ChatGPT的文章:微信接入ChatGPT,使用NodeChatGPTWechaty做一个微信机器人_DieHunter1024的博客-CSDN博客 站在巨…

ChatGPT接入个人微信企业微信(国内通用)

ChatGPT近期以强大的对话和信息整合能力风靡全网,可以写代码、改论文、讲故事,几乎无所不能,这让人不禁有个大胆的想法,能否用他的对话模型把我们的微信打造成一个智能机器人,可以在与好友对话中给出意想不到的回应&am…

controller-runtime源码学习

本文基于controller-runtime v0.11.2版本进行源码学习 kubebuilder、operator-sdk这些框架都是在controller-runtime基础上做了一层封装,方便开发者快速生成项目的脚手架,本文会以kuebuilder搭建工程作为使用controller-runtime的demo进行源码分析 1、k…

paddle表情识别部署

表情识别模块1.环境部署1.1同样采用fastDeploy库1.2相关模型2.封装成静态库2.1参考[百度Paddle中PP-Mattingv2的部署并将之封装并调用一个C静态库](https://blog.csdn.net/weixin_43564060/article/details/128882099)2.2项目依赖添加2.3生成成功3.test3.1创建emotion_test项目…

多传感器融合定位十二-基于图优化的建图方法其一

多传感器融合定位十二-基于图优化的建图方法其一1. 基于预积分的融合方案流程1.1 优化问题分析1.2 预积分的作用1.3 基于预积分的建图方案流程2. 预积分模型设计3. 预积分在优化中的使用3.1 使用方法3.2 残差设计3.3 残差雅可比的推导3.3.1 姿态残差的雅可比3.3.2 速度残差的雅…

Python3.10新特性之match语句示例详解

这篇文章主要为大家介绍了Python3.10新特性之match语句示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪正文在Python 3.10发布之前,Python是没有类似于其他语言中switch语句的&…

Clip-path实现按钮流动边框动画

前言 &#x1f44f;Clip-path实现按钮流动边框动画&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 添加div标签 <div>苏苏_icon</div>添加样式 div {position: relative;width: 220px;height: 6…

1947抓住那头牛(队列 广度优先搜索)

目录 题目描述 解析 解题思路 代码部分 代码部分 运行结果 看看len数组中各个位置的标记值 为什么这样做一定是最短路径&#xff1a; 题目描述 农夫知道一头牛的位置&#xff0c;想要抓住它。农夫和牛都位于数轴上&#xff0c;农夫起始位于点N(0<N<100000)&…

Java八股文(Java面试题)

JDK、JRE、JVM 三者之间的关系&#xff1f;JDK&#xff08;Java Development Kit&#xff09;&#xff1a;是Java开发工具包&#xff0c;是整个Java的核心&#xff0c;包括了Java运行环境JRE、Java工具和Java基础类库。它能够创建和编译程序。JRE&#xff08;Java Runtime Envi…

MySQL-字符集和比较规则

在计算机中只能存储二进制数据&#xff0c;那该怎么存储字符串呢&#xff1f;当然是建立字符与二进制数据的映射关系 了&#xff0c;建立这个关系最起码要搞清楚两件事&#xff1a; 界定清楚字符范围&#xff1a;需要把哪些字符映射成二进制数据&#xff1f;编码与解码&#x…

九龙证券|外资强势出手!这只科创板百元股,被疯狂加仓

本周&#xff0c;北上资金净买入29.32亿元&#xff0c;连续第13周加仓A股。分商场看&#xff0c;北上资金加仓重点倾向于沪市的白马蓝筹股&#xff0c;沪股通取得50.34亿元&#xff0c;深股通则被净卖出21.02亿元。 食品饮料本周取得逾23亿元的增持&#xff0c;居职业首位&…

leaflet 读取上传的geojson文件,转换为wkt文件(057)

第057个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中上传geojson文件,解析geojson文件并转换为WKT,并在地图上显示图片。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共128行)安装 @terraf…

软件测试/自动化测试/测试开发/性能测试经典好书推荐

目录 前言 测试理论与实践 性能测试 安全测试 自动化测试 编程语言与开发技能 管理技能 前言 软件测试入行容易进阶难。从测试小白成长为测试经理、总监级别人才&#xff0c;要跨越长长的技术栈升级之路&#xff0c;挑战非常高的综合能力要求。 大牛都是相似的&#xf…

五分钟看懂Java字节码:极简手册

字节码新手很容易被厚厚的 JVM 书籍劝退&#xff0c;即使我看过相关书籍&#xff0c;工作真正用到时也全忘了&#xff0c;还得现学。 等我有了一定的字节码阅读经验&#xff0c;才发现字节码其实非常简单&#xff0c;只需要三步就能快速学会&#xff1a; 先了解 JVM 的基本结…

【设计模式之美 设计原则与思想:面向对象】14 | 实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?

在上一节课中&#xff0c;针对接口鉴权功能的开发&#xff0c;我们讲了如何进行面向对象分析&#xff08;OOA&#xff09;&#xff0c;也就是需求分析。实际上&#xff0c;需求定义清楚之后&#xff0c;这个问题就已经解决了一大半&#xff0c;这也是为什么我花了那么多篇幅来讲…

创建Django项目

创建Django项目 步骤 创建Django项目 django-admin startproject name 创建子应用 python manager.py startapp name创建工程 在使用Flask框架时&#xff0c;项目工程目录的组织与创建是需要我们自己手动创建完成的。 在django中&#xff0c;项目工程目录可以借助django提供…

嵌软工程师要掌握的硬件知识2:一文看懂什么开漏和推挽电路(open-drain / push-pull)

想了解开漏和推挽,就要先了解一下三极管和场效应管是什么,在其他章节有详细介绍,本文就不再进行赘述。 1 推挽(push pull)电路 1.1 理解什么是推挽电路 - 详细介绍 如图所示,Q3是个NPN型三极管,Q4是个PNP型三极管。 1)当Vin电压为正时,上面的N型三极管控制端有电…

ccc-Classification-李宏毅(4)

文章目录Classification 概念Example ApplicationHow to do ClassificationWhy not RegesssionProbability from Class - FeatureProbability from ClassHow’s the results?Modifying ModelThree StepsProbability DistributionClassification 概念 本质是找一个函数&#x…