首页 > 其他分享 >欧拉路径和欧拉回路

欧拉路径和欧拉回路

时间:2023-09-24 11:33:05浏览次数:54  
标签:遍历 递归 路径 此时 出边 回路 条边 欧拉

这是之前关于欧拉路的两篇博客。

关于欧拉路的逆序压栈问题:here

22年写的一个小总结:here

关于欧拉路,主要疑点在于两个:一是压栈输出的原理;二是打上标记后时间复杂度退化的问题。

  • 压栈输出的原理

走到点u时,有两种情况:

  1. u此时是终点,那么没有没走过的边与之相连。
  2. u此时不是终点,那么它一定还要继续走,也就是还有没走过的边与之相连。

注意:u此时不是终点,不代表它一定不是终点,因为一个点可能重复经过,就好比下面那个图,1号点一开始不是终点,但是最后可能是终点。

qishi

  • 打上标记后时间复杂度为何会退化

考虑这样这个图(无向图,有向图的情况,图中的无向边{u, v}改成两条有向边(u,v), (v,u)即可。):

n=2,只有两个点,共有m条边,现在来看下打标记的做法会遍历多少次边。

记u:cnt,为第cnt次经过u号点。

1:1,此时遍历到h[u]就会递归到2。
2:1,此时遍历到h[u]就会递归到1。
1:1,此时会遍历e[1],发现边有标记,然后到e[2],递归到2。
2:2,此时会遍历e[1],发现边有标记,然后到e[2],递归到1。
……

观察一下,1:1后,经过了1条边,2:1后,经过了2条边,1:2后经过了3条边,2:2后经过了4条边,1:3经过了5条边……

不难发现,2:x后经过了2x条边,那么也就是说,对于二号点,直到走完了m条边递归才会结束,也就是递归了m/2次。
1号点的递归次数也大致是m/2次。(之所以是大致,是因为根据不同实现方式,可能会多一两个常数)。

对于1号点:1:1,遍历1个出边;1:2遍历2个出边;……1:m/2,遍历m/2个出边,一共遍历了m^2级别的边。

二号点也是如此,所以会超时。

所以此时,我们考虑实时更新h[u],让后面重复递归的点不再枚举到走过的边,将边真正意义上删除。

然而,此时还没考虑递归结束后回溯的情况。

1:1,回溯之后还会遍历2、3、……m的出边。
1:2,回溯之后还会遍历3、……的出边。

总共也是m^2级别的打过标记的边数。

也就是说,后递归的点总过的边,应当不让之前递归的点再走,可是我们明明已经删去了这条边啊,为什么这样呢?

其实这样的:

我们递归删边的时候,将h[u]连到了后续节点,但是不论怎么连,当前点枚举时候使用的局部变量i都不会被更新。

所以,其实我们的i应当改为h[u],这样才能保证后续删去的边不会在回溯时被遍历到。

标签:遍历,递归,路径,此时,出边,回路,条边,欧拉
From: https://www.cnblogs.com/zhangchenxin/p/17725636.html

相关文章

  • 代码随想录算法训练营day17 | ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.
    110.平衡二叉树classSolution{public:intgetHeight(TreeNode*node){if(node==NULL)return0;intleftHeight=getHeight(node->left);if(leftHeight==-1)return-1;intrightHeigh......
  • linux 查看jdk安装路径
    [root@iz2ze9ufq5ehrayz6j88sazbin]#java-versionjavaversion"1.8.0_191"Java(TM)SERuntimeEnvironment(build1.8.0_191-b12)JavaHotSpot(TM)64-BitServerVM(build25.191-b12,mixedmode)[root@iz2ze9ufq5ehrayz6j88sazbin]#whichjava/usr......
  • window和linux下有关xxx.dll和xxx.so动态库,可执行文件运行时的动态库检索路径文档
    没想到详细的内容都在库和命令的man手册中。ld.so动态库手册里有描述ELF可执行文件在运行时,都会在哪几个位置检索动态库。如果共享对象依赖项不包含斜杠,则它按以下顺序搜索:(1)使用二进制文件的DT_RPATH动态节属性中指定的目录(如果存在且DT_RUNPATH属性不存在)。不推荐......
  • mysql查找data数据路径
    直接在MySQL运行代码showglobalvariableslike"%datadir%"; TRANSLATEwithxEnglishArabicHebrewPolishBulgarianHindiPortugueseCatalanHmongDawRomanianChineseSimplifiedHungarianRussianChineseTraditionalIndonesia......
  • docker存储路径修改到自定义目录路径
    通过修改Docker配置文件的方式来修改Docker数据存储路径,以减少系统盘的占用空间。具体步骤如下:1、停止Docker服务sudosystemctlstopdocker2、备份当前的Docker数据存储目录/var/lib/dockersudomv/var/lib/docker/var/lib/docker.bak3、创建新的Docker数据存......
  • PostgreSQL 9.6修改数据存储路径
    说明使用的PostgreSQL版本是9.6版本的。实际项目部署过程中,数据库的数据有时候被要求保留5-10年,甚至更久。随着数据量的增大,磁盘占用空间也会随之增大。当数据库默认的安装路径所在目录的磁盘空间不够大时,可以考虑扩容,或者修改数据库数据存放的路径,将路径指定到一个足够大......
  • win10操作系统动态链接库DLL文件搜索路径
    搜索可执行文件(xx.exe)同级目录下的其它DLL文件(不会搜索子文件夹)32位程序C:\Windows\System32操作系统当前用户或者系统用户Path环境变量中直接包含的文件夹(子文件夹中的DLL同样无法被搜索到,不是递归搜索)在终端执行D:\code>C:\Users\XXX\Desktop\新建文件夹\bb.......
  • Java中获取类加载路径和项目根路径
    publicclassTest{publicstaticvoidmain(String[]args){//LIVETEMPLATEpsvm+Tab键soutTesttest=newTest();try{test.showURL();}catch(Exceptione){e.printStackTrace();}......
  • 124. 二叉树中的最大路径和
    二叉树中的路径被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中至多出现一次。该路径至少包含一个节点,且不一定经过根节点。路径和是路径中各节点值的总和。给你一个二叉树的根节点root,返回其最大路径和。示例1:输入:root=......
  • centos中自带java的路径配置
    centos自带的java,可以直接运行java,但不知道是怎么访问到的,所以就查了一下[root@aaa]#java-versionopenjdkversion"1.8.0_262"OpenJDKRuntimeEnvironment(build1.8.0_262-b10)OpenJDK64-BitServerVM(build25.262-b10,mixedmode)查看版本号,可以看到能访问ja......