• dfs树上的边


    by   GeneralLiu

    一 开 始 学

    tarjan 的 强连通分量 , 割边 , 割点 

    没有 学扎实

    经过培训 ,发现了些 需要注意的 小细节

    举个荔枝

    dfs树 上的 边 

    学了 tarjan 的 应该有所体会

    tarjian 算法 是基于 原图 的 dfs树 上的

    下面就介绍一下我从此 博客

    上学到的

    dfs树 上的

    树边  前向边  后向边  横叉边

    到底是啥

    树边,前向边,后向边,横叉边,应该说,不是一个图本身有的概念,应该是图进行DFS时才有的概念。

    图进行DFS会得到一棵DFS树(森林),在这个树上才有了这些概念。

    对图进行DFS,可以从任意的顶点开始,遍历的方式也是多样的,所以不同的遍历会得到不同的DFS树,进而产生不同的树边,前向边,后向边,横叉边。所以这4种边,是一个相对的概念。

    在图的遍历中,往往设置了一个标记数组vis的bool值来记录顶点是否被访问过。

    但有些时候需要改变vis值的意义。

    令vis具有3种值并表示3种不同含义
    vis = 0,表示该顶点没没有被访问
    vis = 1,表示该顶点已经被访问,但其子孙后代还没被访问完,也就没从该点返回
    vis = 2,,表示该顶点已经被访问,其子孙后代也已经访问完,也已经从该顶点返回
    可以vis的3种值表示的是一种顺序关系和时间关系

    《算法导论》334页有这4种边的准确定义,在此不累述

    DFS过程中,对于一条边u->v
    vis[v] = 0,说明v还没被访问,v是首次被发现,u->v是一条树边
    vis[v] = 1,说明v已经被访问,但其子孙后代还没有被访问完(正在访问中),而u又指向v?说明u就是v的子孙后代,u->v是一条后向边,因此后向边又称返祖边
    vis[v] = 3,z说明v已经被访问,其子孙后代也已经全部访问完,u->v这条边可能是一条横叉边,或者前向边

    注意:树边,后向边,前向边,都有祖先,后裔的关系,但横叉边没有,u->v为横叉边,

    说明在这棵DFS树中,它们不是祖先后裔的关系它们可能是兄弟关系,堂兄弟关系,甚至更远的关系,

    如果是dfs森林的话,u和v甚至可以在不同的树上

    在很多算法中,后向边都是有作用的,但是前向边和横叉边的作用往往被淡化,其实它们没有太大作用。

  • 相关阅读:
    Linux中应用程序如何使用系统调用syscall
    Spring Service、Dao进行Junit单元测试
    spring service层单元测试
    java-随机生成用户名(中文版及英文版)
    Java获取随机数
    JUnit单元测试框架的使用
    Mock以及Mockito的使用
    Spring Boot 各Starter介绍
    编写自己的SpringBoot-starter
    Spring Boot使用单元测试
  • 原文地址:https://www.cnblogs.com/1227xq/p/6824333.html
Copyright © 2020-2023  润新知