欧拉回路(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,一经查实,立即删除!

相关文章

【Linux】Linux常用指令介绍

目录 1、whoami命令 2、pwd命令 3、ls命令 4、cd命令 5、touch命令 6、mkdir命令 7、rm命令 8、man命令 9、cp命令 10、mv命令 11、cat命令 12、more命令 13、less命令 14、head命令 15、tail命令 16、find命令 1、whoami命令 语法&#xff1a;whoani 功能&a…

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…

解锁人体姿态的秘密:部件亲和场(PAF)的革新应用

部件亲和场(PAF)原理及其在人体姿态估计中的应用 摘要: 随着人工智能技术的发展,人体姿态估计在计算机视觉领域受到越来越多的关注。部件亲和场(Part Affinity Fields,简称PAF)作为一种新兴的人体姿态估计技术,通过构建2D向量场来描述人体肢体的方向和位置信息,从而…

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__ //…

多智能体强化学习简介

基础概念 什么是多智能体系统 多智能体系统&#xff08;Multi-Agent System&#xff0c;MAS&#xff09;是由多个自主智能体组成的系统。这些智能体可以协同工作&#xff0c;也可以独立行动&#xff0c;以实现各自的目标。在多智能体系统中&#xff0c;每个智能体都有自己的决…

在你的 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;省的每次点击菜单都要加载 一、动态…

2021 年 3 月青少年软编等考 C 语言一级真题解析

目录 T1. 字符菱形思路分析 T2. 与圆相关的计算思路分析 T3. 苹果和虫子 2思路分析 T4. 奇数求和思路分析 T5. 药房管理思路分析 T1. 字符菱形 给定一个字符&#xff0c;用它构造一个对角线长 5 5 5 个字符&#xff0c;倾斜放置的菱形。 时间限制&#xff1a;1 s 内存限制&a…

3、云原生安全之falco的部署

文章目录 1、helm安装2、拉去镜像失败与解决3、安装faclo4、安装nfs服务器,配置k8s的持久卷4.1、创建nfs服务器,4.2、部署master节点(nsf服务的客户端)4.3、pv与pvc4.4、假设pv和pvc的配置文件出错了5、安装falcosidekick可视化(建议跳过,直接使用6)6、安装faclo与falco…

【设计模式 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集合常用方法

计算机体系结构安全:对体系结构如何支持安全机制进行调研

一、体系结构支持信任建立和主动防御的技术&#xff1a; 可信3.0 二、体系结构怎么更好的支持信任建立和主动防御 2.1 支持信任建立 一、以手机芯片举例&#xff0c;用智能手机的芯片作为信任根&#xff0c;确保应用程序和敏感数据受到保护。 二、启动时验证操作系统和应用…

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

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

深入理解算法的空间复杂度

算法一&#xff1a;逐步递增型 void Loveyou(int n)//n为问题规模 {int i1;while(i<n){i;printf("I love you %d\n",i);}printf("I love you more than %d\n",n);//5 } int main() {Loveyou(3000);return 0; } 无论问题规模怎么变&#xff0c;算法运行…