zoukankan      html  css  js  c++  java
  • 图论——Tarjan 初步 DFS序+时间戳+欧拉序

    一、什么是DFS序:

    DFS序是按照先序遍历,先遍历根节点然后依次遍历左子树,右子树的过程,每次遇到新的节点就把新访问节点加到序列中,代码如下:

    int DFSrk[100000];
    int cnt=0;
    int dfs(int u,int fa)
    {
        DFSrk[cnt++]=u;
        for(int i=head[u];i;i=ege[i].next)
        {
            if(ege[i].to!=fa)dfs(ege[i].to,u);
        }
    }
    //vector储存 如下
    int dfs(int u,int fa)
    {
        DFSrk[cnt++]=u;
        for(int i=0;i<ege[u];i++)
        {
            if(ege[u][i]=fa)dfs(ege[u][i],u);
        }
    }

    二、DFS序性质

    我么会发现对于图中的三棵子树他们的DFS序连续:

    A-B-C-D-E-F-G-H

    B-C-D-E

    F-G-H

    也就是说在一棵子树上的DFS序,他们一定是连续的,那么我们可以做树上的差分,这里可以保留一下,稍后填坑。

    一、什么是时间戳:

    时间戳我们有两个标记第一个是第一次访问的时候记录一下,然后是在最后一次访问时再标记一下。 

    二、时间戳的性质:

    我们可以直接通过时间戳来判断一个节点是否是另一个节点的子节点。

    一、什么是欧拉序:

    欧拉是每次访问一个点到一个点,就要存一次,无论这个点之前访问过没有,就要遇见点就存。还有就是有的会认为叶节点也访问了两次则有如下欧拉序:A-B-C-C-B-D-E-E-D-B-A-F-G-G-F-A

    主要用途是tarjan,用起来很舒服,比如求LCA,求LCA以上都可以使用其实。

  • 相关阅读:
    让你少奋斗10年的工作经验
    POJ Exponentiation解题
    数据结构树和二叉树
    语句摘录
    ACM解题报告格式
    编程规范
    数据结构图
    Java学习之二Java反射机制
    使用Python正则表达式提取搜索结果中的站点
    toj 1702 A Knight's Journey
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798705.html
Copyright © 2011-2022 走看看