zoukankan      html  css  js  c++  java
  • dfs序和欧拉序

    欧拉序

    定义:

    树的欧拉序是对树进行DFS的一种序列。有两种形式:

    • 1、在每个结点进和出都加进序列。
    • 2、只要到达每一个结点就把他加进序列。

    例如:给出一棵树:

     
    Tree
    第一种方法得到的序列和对应的进出状态分别是:

    1 2 3 3 4 4 5 5 2 6 7 7 8 8 6 1

    进 进 进 出 进 出 进 出 出 进 进 出 进 出 出 出 (每个结点恰好出现了两次)

    用这个序列可以解决树上求和的问题:
    • 1、求某个点到根节点的权值和。方法是:需要在进的点处做加法,出的点处做减法,查询某点就只需要查询对应的前缀即可。
    • 2、求某个子树的权值和。方法是:需要在进的点处做加法,求某个点最后一次出现的位置的前缀和减去第一次出现的位置的前一个位置的前缀和即可。
    第二种方法得到的序列是:

    1 2 3 2 4 2 5 2 1 6 7 6 8 6 1

    用这一个序列,可以解决的一个问题是:
    • 1、求某两点的LCA。显然这两点之间的区间中,深度最小点就是LCA。这可以用RMQ解决。
    • 2、求某个子树的权值和,方法是:只记录第一次出现的数的值,同样的查询某点就只需要查询该点在欧拉序中最后出现的位置的前缀即可减去第一次出现的额位置-1的前缀和即可。
    • 3、换根操作:这种欧拉序相当于以根为起点围着树跑了一圈,那么我们就可以把欧拉序写成一个环就是:

    1 2 3 2 4 2 5 2 1 6 7 6 8 6 1 2 3 2 4 2 5 2 1 6 7 6 8 6

    以某个点为跟的欧拉序就是以某个点在上面的欧拉序中第一次出现的位置为起点向前走(2*n-1)步,例如以4为根的欧拉序就是

    1 2 3 2 4 2 5 2 1 6 7 6 8 6 1 2 3 2 4 2 5 2 1 6 7 6 8 6



    作者:Pealicx
    链接:https://www.jianshu.com/p/55037ae618ce
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    Oracle连接数过多释放机制
    Sql优化(三) 关于oracle的并发
    查询Oracle正在执行的sql语句
    odi增量更新策略
    如何查询Oracle性能监控
    Oratop工具——实时数据库性能监控工具
    Oracle超出最大连接数问题及解决
    oracle查看允许的最大连接数和当前连接数等信息
    八大算法思想
    面向切面编程的解释
  • 原文地址:https://www.cnblogs.com/hulian425/p/13746705.html
Copyright © 2011-2022 走看看