欧拉回路

news/2025/3/19 19:14:37/文章来源:https://www.cnblogs.com/mendax-Z/p/18231771

概念

1.经过图中所有边恰好一次的通路称为欧拉通路或欧拉路(起点终点可以不一致)
2.经过图中所有边恰好一次的回路称为欧拉回路(起点终点一致)
3.判别方法:对于无向图G,G中存在欧拉回路当且仅当G中所有度非0的点是连通的且没有奇数度数的点
对于无向图G,G中存在欧拉路当且仅当G中所有度非0的点是连通的且G中恰好有0个或2个奇数度数的点(0个表示存在欧拉回路)
对于有向图G,G中存在欧拉回路当且仅当G中所有度非0的点是强联通的且每个点的入度等于出度
对于有向图G,G中存在欧拉路当且仅当:
1)将G中所有有向边改为无向边后,G中所有度非0的点是连通的
2)最多只有一个点出度减入度为1;
3)最多只有一个点入度减出度为1;
4)其他所有点的入度等于出度

求欧拉图流程



首先从C开始:
C->D->E->F:走到头了,那么把F加入到路径中
回溯:C->D->E->B->A->D->G->H->E,走到头了
E加入到路径中,回溯H加入路径,G,D,A,B,E,D,C依次回溯加入到路径去
最终路径中存的是:
F <- E <- H <- G <- D <- A <- B <- E <- D <- C
倒序输出即为所求的欧拉通路
代码实现,有向图版本:

vector<int> edges[N+1];
int n,m,l,f[N+1],ind[N+1],outd[N+1],c[M+2];void dfs(int x){int len=edge[x].size();//因为从头到尾一个点可能被枚举到很多次,所以可以记录这个点枚举到了哪里for(;f[x]<len;){ int y=edge[x][f[x]]; f[x]++;dfs(y);c[++l]=y;//记录路径信息(在c中倒序依次输出,即为欧拉路)/*比如c={1,2,3,4,1};那么 1->4->3->2->1即为要求的欧拉路径 */ }
}void Euler(){int x=0,y=0,z=0;//x是起点,y是有多少个点的出度比入度大1,z表示有多少个点出度不等于入度 for(int i=1;i<=n;i++){if(ind[i]+1==outd[i]){x=i,++y;}if(ind[i]!=outd[i]){++z;}}//!z所有点的出度都能与入度或有一个点的出度比入度大1并且有两个点的出度不等于入度,这样就有欧拉路 if(!((y==1&&z==2)||!z)){cout<<"NO"<<endl;return ;} //如果起点还没找到,随便找一个度非0的点就行了 if(!x){for(int i=1;i<=n;i++)if(ind[i]) x=i;}memset(f,0,sizeof f);l=0;dfs(x);c[++l]=x;//x为最终的起点,所以要加到路径里面去cout<<"YES"<<endl;for(int i=l;i;--i) cout<<c[i]<<" "; 
}

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

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

相关文章

ElasticSearch性能原理拆解

逐层拆分ElasticSearch的概念Cluster:集群,Es是一个可以横向扩展的检索引擎(部分时候当作存储数据库使用),一个Es集群由一个唯一的名字标识,默认为“elasticsearch”。在配置文件中指定相同的集群名,Es会将相同集群名的节点组成一个集群。Node:节点,集群中的任意一个实…

图论

1 图论 1.1 图的建立1.1.1 领接表边权建图import java.util.ArrayList; import java.util.List; import java.util.Scanner;public class Main {// 定义图的邻接表表示static List<int[]>[] g;// 节点数static int n;// 保存某种状态或结果的数组static int[] f;public s…

IO

IO电路其实就是指芯片的信号输入输出接口电路,其一般位于芯片版图的最外围。IO电路一般有以下几个功能: (1)实现电平转换 (2)提高驱动能力 (3)进行ESD保护 先说电平转换。芯片内部电路信号的高低电平和外部要求不一致时,这样通过IO电路可以实现电平的转换。 再说驱动能…

Level shifter

(M1由关断到开启,肯定是先进入饱和区,因为这个临界点时,M1的Vds=VDDH>Vgs-Vth1=VDDL-Vth1,肯定是饱和区) M1的饱和区电流肯定先是大于M3的线性区电流,使得N点持续由VDDH放电到地,这个过程不能使得M1电流小于M3电流,否则N点下拉失败,OUT无法输出高电平VDDH。也就是…

从上下文切换谈thread_local工作原理

介绍thread_local的实现原理从上下文切换谈thread_local工作原理 thread_local是什么 熟悉多线程编程的小伙伴一定对thread_local不陌生,thread_local 是 C++11 引入的一种存储类说明符,用于定义每个线程都有其独立实例的变量。每个线程对这些变量有自己的副本,而不共享其他…

POR

上电复位(POR)电路,其作用是保证在施加电源后,模拟和数字模块初始化至已知状态。基本上电复位(POR)功能会产生一个内部复位脉冲以避免"竞争"现象,并使器件保持静态,直至电源电压达到一个能保证正常工作的阈值。注意,此阈值电压不同于数据手册中给出的最小电…

C++U7-07-图的遍历进阶

学习目标 引例 深搜遍历 [【图的遍历进阶】有向图中的可达]【算法分析】 从 a 点广搜,并用 vis 数组标记从 a 能够到达的点,如果 vis b ​=true,则表示能够到达,否则反之。【参考代码】 #include<bits/stdc++.h> using namespace std; const int maxn = 2e5 + …

第2次总结性Blog-题目集4~6

目录前言 设计与分析 采坑心得 改进建议 总结关于java&面向对象在经过这几个月的系统性的java学习中,我始终牢记着一句话:面对对象程序设计最重要的是设计,而不是代码。设计即要遵守单一职责原则,简单来说就是什么该做,什么不该做。设计的越好,复用性就越高,需要修改…

一款WPF的精简版MVVM框架——stylet框架的初体验(包括MVVM绑定、依赖注入等操作)

今天偶然知道一款叫做stylet的MVVM框架,挺小巧的,特别是它的命令触发方式,简单粗暴,让人感觉很巴适,现在我做一个简单的demo来顺便来分享给大家。 本地创建一个WPF项目,此处我使用.NET 8来创建。然后引用stylet最新的nuget包。 然后删掉App.xaml里面自带的启动项删掉以后…

按键中断驱动程序-poll机制

前言:学东西的时候总是喜欢碎碎念,去思考该怎么学。关于嵌入式开发,以前就觉得嵌入式只是一个工具,关键还是结合专业知识赋能,比如控制、信号处理、神经网络、计算机网络、各种协议比如蓝牙、wifi,音视频,当然,如果能够把内核学的很透彻,那也是很了不起的。现在越学越…