欧拉回路(Eulerian Path)

1.定义

如果图 G G G(有向图或者无向图)中所有边一次仅且一次行遍所有顶点的通路称作欧拉通路。

如果图 G G G中所有边一次仅且一次行遍所有顶点的回路称作欧拉回路。

具有欧拉回路的图成为欧拉图(简称 E E E图)。具有欧拉通路但不具有欧拉回路的图成为半欧拉图。
顶点可以经过多次
画个图分辨一下:

  • 欧拉通路:
    image
  • 欧拉回路
    image
    简单来讲就是欧拉通路能够从起点到终点,欧拉回路能够回到起点

2.定理及推论

欧拉通路和欧拉回路的判定是很简单的
无向图 G G G存在欧拉通路的充要条件是:
G G G为连通图,并且 G G G仅有两个奇度节点(度数为奇数的顶点)或者无奇度节点
推论1:

  1. G G G是仅有两个奇度节点的连通图时, G G G的欧拉通路必以此两个节点为端点
  2. G G G是无奇度节点的连通图时, G G G必有欧拉回路
  3. G G G为欧拉图(存在欧拉回路)的充分必要条件是 G G G为无奇度节点的连通图

有向图 D D D存在欧拉通路的充要条件是:
D D D为有向图, D D D的基图联通,并且所有顶点的出度与入度都相等;或者除两个顶点外,其余顶点的出度与入度都相等,而在这两个顶点中一个顶点的出度与入度只为 1 1 1,另一个顶点的出度与入度之差为 − 1 −1 1
推论2:

  1. 当 D 除出、入度之差为 1 , − 1 的两个顶点之外,其余顶点的出度与入度都相等时, D 的有向欧拉通路必以出、入度之差为 1 的顶点作为始点,以出、入度之差为 − 1 的顶点作为终点 当D除出、入度之差为1,−1的两个顶点之外,其余顶点的出度与入度都相等时,D的有向欧拉通路必以出、入度之差为1的顶点作为始点,以出、入度之差为−1的顶点作为终点 D除出、入度之差为11的两个顶点之外,其余顶点的出度与入度都相等时,D的有向欧拉通路必以出、入度之差为1的顶点作为始点,以出、入度之差为1的顶点作为终点
  2. 当 D 的所有顶点的出、入度都相等时, D 中存在有向欧拉回路 当D的所有顶点的出、入度都相等时,D中存在有向欧拉回路 D的所有顶点的出、入度都相等时,D中存在有向欧拉回路
  3. 有向图 D 为有向欧拉图的充分必要条件是 D 的基图为连通图,并且所有的顶点的出、入度都相等 有向图D为有向欧拉图的充分必要条件是D的基图为连通图,并且所有的顶点的出、入度都相等 有向图D为有向欧拉图的充分必要条件是D的基图为连通图,并且所有的顶点的出、入度都相等

3.欧拉通路回路存在的判断

根据定理和推论,我们可以很好的找到欧拉通路回路的判断方法

A.判断欧拉通路是否存在的方法#

  • 有向图:图连通,有一个顶点出度大于入度 1 ,有一个顶点入度大于出度 1 ,其余都是出度 = 入度 有向图:图连通,有一个顶点出度大于入度1,有一个顶点入度大于出度1,其余都是出度=入度 有向图:图连通,有一个顶点出度大于入度1,有一个顶点入度大于出度1,其余都是出度=入度
  • 无向图:图联通,只有两个顶点是奇数度,其余都是偶数度

B.判断欧拉回路是否存在的方法

  • 有向图:图联通,所有的顶点出度=入度
  • 无向图:图联通,所有的顶点都是偶数度

4.欧拉回路的应用

  1. 哥尼斯堡七桥问题
  2. 一笔画问题
  3. 旋转鼓轮的设计

5.欧拉回路的判断

D F S DFS DFS

邻接矩阵的时间复杂度为 O ( n 2 ) O(n^2) O(n2)
邻接表的时间复杂度为 O ( n + e ) O(n+e) O(n+e)
如果,重边太多的话,邻接表会挂掉:)

请看这篇文章

6.欧拉回路的求解

板子题:骑马修栅栏
传送门
题目保证有解。

A.DFS搜索求解欧拉回路

基本思路:利用欧拉定理判断出一个图存在欧拉回路或欧拉通路后,选择一个正确的起始顶点,用DFS算法遍历所有的边(每条边只遍历一次),遇到走不通就回退。在搜索前进方向上将遍历过的边按顺序记录下来。这组边的排列就组成了一条欧拉通路或回路。

#include <bits/stdc++.h>
using namespace std;
int bian[510],n,m,ans[510];
int mapp[510][510],c=0;
void dfs(int j){for(int i=1;i<=n;i++){if(mapp[j][i]>0){mapp[i][j]--;mapp[j][i]--;dfs(i);}}ans[c++]=j;
}
int main(){cin>>m;int a,b;for(int i=0;i<m;i++){cin>>a>>b;mapp[a][b]++;mapp[b][a]++;bian[a]++;bian[b]++;n=a>n?a:n;n=b>n?b:n;}int flag=1;for(int i=n;i>=1;i--){if(bian[i]%2==1){flag=i;}}dfs(flag);for(int i=c-1;i>=0;i--){cout<<ans[i]<<endl;}
}

B.Fleury(佛罗莱)算法

  • Fleury算法是对DFS爆搜的一种改进,使用DFS漫不经心的随意走效率是不高的,Fleury是一种有效的算法
    ps:其实我也不会,这里就只介绍一下吧
    image
    我个人感觉是把大连通块分成了零散的几个小连通块然后分块连接
    关键是能不走桥就不走桥,实在无路可走了才会去走桥
    代码就不给了,估计给了也是错的

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

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

相关文章

SpringMVC--03--前端传数组给后台

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 案例1乘客个人信息方法1&#xff1a;表单提交&#xff0c;以字段数组接收方法2&#xff1a;表单提交&#xff0c;以BeanListModel接收方法3&#xff1a;将Json对象序…

leetcode移除元素

注意&#xff0c;在本题中&#xff0c;是对原数组进行操作&#xff0c;需要原地删除指定元素&#xff0c;所以我们可以采用快慢指针来操作。 顾名思义&#xff0c;快慢指针是有两个指针&#xff0c;一直快指针&#xff0c;一个慢指针。在本题中&#xff0c;快慢指针起点都是0&a…

Matlab 机器人工具箱 运动学

文章目录 R.fkine()R.ikine()R.ikine6s()R.ikuncR.jacob0、R.jacobn、R.jacob_dotjtrajctraj参考链接 官网&#xff1a;Robotics Toolbox - Peter Corke R.fkine() 正运动学&#xff0c;根据关节坐标求末端执行器位姿 mdl_puma560; % 加载puma560模型 qz % 零角度 qr …

继承(使用及深入、super、重写/复写)--学习JavaEE的day14

day14 一、继承 概念 Java中的继承是一个对象获取父对象的所有属性和行为的机制 理解&#xff1a;继承是指一个类(子类)可以继承另一个类(父类)的属性和方法 关键字extends 优点&#xff1a;减少代码的冗余 缺点&#xff1a;继承会增加类与类之间的关系&#xff0c;会增加代码…

[Unity3d] 网络开发基础【个人复习笔记/有不足之处欢迎斧正/侵删】

TCP/IP TCP/IP协议是一 系列规则(协议)的统称&#xff0c;他们定义了消息在网络间进行传输的规则 是供已连接互联网的设备进行通信的通信规则 OSI模型只是一个基本概念,而TCP/IP协议是基于这个概念的具体实现 TCP和UDP协议 TCP:传输控制协议&#xff0c;面向连接&#xff0c…

VsCode配置PCL、Open3D自动补全

写在前面 本文内容 在VsCode上开发PCL、Open3D相关代码&#xff0c;代码自动补全 Open3D、PCL的安装使用见各个版本的Open3D、PCL的编译、使用教程 平台/环境 windows11(windows10): visual studio 2022&#xff1b;cmake 3.22; VsCode 通过cmake构建项目&#xff1b; 转载请…

Excel MATCH函数 两张顺序不同表格,统一排序

目录 一. 背景二. 添加辅助列,使用MATCH函数生成排序条件三. 效果 一. 背景 有如下图所示的两张表格&#xff0c;分别记录着同一批人的1月份和2月份的工资。表格A和表格B中的姓名列相同&#xff0c;工资列数据不同现在要求参考表格A中的姓名列对表格B中的数据进行排序&#xf…

C语言:预处理

C语言&#xff1a;预处理 预定义符号#define定义常量定义宏宏与函数对比 #操作符##操作符条件编译头文件包含库文件包含本地文件包含嵌套文件包含 预定义符号 C语⾔设置了⼀些预定义符号&#xff0c;可以直接使⽤&#xff0c;预定义符号也是在预处理期间处理的。 __FILE__ //…

在你的 Vue + Electron 项目里,引入 ESLint

因为我的项目是基于 Electron 平台的 Web 应用&#xff0c;使用 Vue 3 实现&#xff0c;而且用了 TypeScript&#xff0c;所以&#xff0c;在引入 ESLint 的时候&#xff0c;要考虑好几种规范的问题。 文章目录 零、简介1. 规则2. 配置文件3. 共享配置4. 插件5. 解析器6. 自定义…

Vue开发实例(九)动态路由实现左侧菜单导航

之前在【Vue开发实例&#xff08;六&#xff09;实现左侧菜单导航】文中实现了菜单的导航&#xff0c;本篇是在那个基础上改造的。 动态路由实现左侧菜单导航 一、动态菜单创建二、根据菜单数据来创建路由三、添加路由已加载标记&#xff0c;省的每次点击菜单都要加载 一、动态…

【设计模式 01】单例模式

单例模式&#xff0c;是一种创建型设计模式&#xff0c;他的核心思想是保证一个类只有一个实例&#xff08;即&#xff0c;在整个应用程序中&#xff0c;只存在该类的一个实例对象&#xff0c;而不是创建多个相同类型的对象&#xff09;&#xff0c;并提供一个全局访问点来访问…

java012 - Java集合基础

1、集合基础 1.1 集合概述 引用数据类型包括&#xff1a;类、接口、数组[] 1.2 ArrayList构造和添加方法 代码&#xff1a; 空集合对象&#xff1a;[] add() add(int index,E element): 1.3 ArrayList集合常用方法

Stable Diffusion 模型分享:Henmix_Real(人像、真实、写真、亚洲面孔)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八下载地址模型介绍 作者述:这个模型试图改

Springboot教程(五)——单元测试

idea中一般使用JUnit进行单元测试 基本使用 我们可以在idea的test文件夹下的XXXXApplicationTests内进行单元测试&#xff1a; 可以在Test标注的方法上写测试代码&#xff1a; SpringBootTest class C0101ApplicationTests {Testfun contextLoads() {println("Hello …

基础二分学习笔记

模板 : 个人倾向第一种 ; 整数二分 : 最大化查找 : 可行区域在左侧 : 查找最后一个<q的数的下标 : int find(int q){// 查找最后一个 < q 的下标 int l 0 , r n 1 ;while(l 1 < r){int mid l r >> 1 ;if(a[mid]<q) l mid ;else r mid ;}return…

土壤类型数据

国家地球系统科学数据中心

AGM CPLD (AGRV2K )的时钟(外部时钟和片上内部振荡器)

AGM CPLD &#xff08;AGRV2K &#xff09;的时钟(外部时钟和片上内部振荡器) 外部晶振 与 内部振荡器&#xff1a; mcu 和 cpld 联合编程时&#xff0c; 整颗芯片需要一颗外部晶振。 &#xff08;芯片有内部振荡器&#xff0c; 但误差较大&#xff0c; 校准后 5%以内误差&…

Electron通过预加载脚本从渲染器访问Node.js

问题&#xff1a;如何实现输出Electron的版本号和它的依赖项到你的web页面上&#xff1f; 答案&#xff1a;在主进程通过Node的全局 process 对象访问这个信息是微不足道的。 然而&#xff0c;你不能直接在主进程中编辑DOM&#xff0c;因为它无法访问渲染器 文档 上下文。 它们…

【软考】数据库的三级模式

目录 一、概念1.1 说明1.2 数据库系统体系结构图 二、外模式三、概念模式四、内模式 一、概念 1.1 说明 1.数据的存储结构各不相同&#xff0c;但体系结构基本上具有相同的特征&#xff0c;采用三级模式和两级镜像 2.数据库系统设计员可以在视图层、逻辑层和物理层对数据进行抽…

matplotlib散点图

matplotlib散点图 假设通过爬虫你获取到了北京2016年3, 10月份每天白天的最高气温(分别位于列表a, b), 那么此时如何寻找出气温和随时间(天)变化的某种规律? from matplotlib import pyplot as pltx_3 range(1, 32) x_10 range(51, 82)y_3 [11,17,16,11,12,11,12,6,6,7,8…