树边,前向边,后向边,横叉边

转自http://www.gonglin91.com/dfs-graph-edge/

树边,前向边,后向边,横叉边,应该说,不是一个图本身有的概念,应该是图进行DFS时才有的概念。图进行DFS会得到一棵DFS树(森林),在这个树上才有了这些概念。对图进行DFS,可以从任意的顶点开始,遍历的方式也是多样的,所以不同的遍历会得到不同的DFS树,进而产生不同的树边,前向边,后向边,横叉边。所以这4种边,是一个相对的概念。
在图的遍历中,往往设置了一个标记数组vis的bool值来记录顶点是否被访问过。但有些时候需要改变vis值的意义。令vis具有3种值并表示3种不同含义
vis = 0,表示该顶点没没有被访问
vis = 1,表示该顶点已经被访问,但其子孙后代还没被访问完,也就没从该点返回
vis = 2,,表示该顶点已经被访问,其子孙后代也已经访问完,也已经从该顶点返回
可以vis的3种值表示的是一种顺序关系和时间关系

更正:《算法导论(第三版)》353页有这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甚至可以在不同的树上

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

时间: 2024-11-03 01:39:09

树边,前向边,后向边,横叉边的相关文章

从赢利前和赢利后分析 提高美国市场APP安装量的技巧

在分析美国应用市场基本国情的基础上,本文结合实战经验,从PR.合作.营销等角度,向有意进军美国市场的APP开发者介绍了赢利前与赢利后提升美国区应用装机量和用户量的技巧和注意事项,希望能为开发者们带来一些启示. App Store 的海量之势有增无减,应用发现变得越来越难了, 因此获取应用装机增量与优质用户不仅变得颇具挑战性,成本也相应地拉高了.其中一个问题就是如何推动应用下载量和用户量?每个人都想知道在美国这块最具吸引力.最有生长空间的市场该怎样做这件事. 过去 3 年中,海豚浏览器团队尝试过许

【算法】 调整数组顺序,使得奇数在前偶数在后,分别保证奇数和偶数之间的相对位置不变

题目:输入一个整形数组,将数组重新排序,使得所有奇数在前偶数在后,并使奇数之间和偶数之间的相对位置爆出不变. 思想:从数组开头开始遍历所有数组.当碰到偶数时,将偶数打包,即记录到目前为止偶数的个数,把这些偶数看成一个整体:当碰到奇数时,将这个奇数与前面的偶数整体对调位置. #include <stdio.h> #include <stdlib.h> void nuo(int *a,int j,int nu)                     //将奇数与前面所有偶数调换位置

NVelocity分页时判断首页前一页后一页末页的详细

共$Data.TotalCount个/$Data.PageNum页 #if($Data.PageNum==1) <span class="disabled"> << </span> <span class="disabled"> < </span> #else <a href="StuList.ashx?PageNum=1"> << </a> #

关于复合索引中的2个索引列谁在前谁在后的进一步讨论--实践篇

关于复合索引中的2个索引列谁在前谁在后的进一步讨论--实践篇: 上一次在长老的QQ群里边说了这么一个例子: create table test_pk( id varchar2(10), create_dt date); alter table test_pk modify (id varchar2 (30 )); insert into test_pk select object_id, sysdate from dba_objects; commit 需要执行的查询是: select * fr

Tomcat 7优化前及优化后的性能对比(转载)

一.运行环境 CPU: Intel(R) Pentium(R) [email protected]  : 内存:4G,装的是32位win7,只认出3G,没有花时间去整ramdisk之类的东西: 操作系统:win7 32位: JDK:1.7.0_55 Tomcat:7.0.53 大家不要笑,公司电脑,就给配这样的,慢的要死,悲剧! 下面所有测试都是基于1000个请求做的,且都是访问Tomcat默认的ROOT首页 二.未调优前 并发用户数从10-1000挨个测试,测试结果如下: 从上面的测试结果来看

前后端分离后的前端时代

本文从前端开发的视角,聊一聊前后端分离之后的前端开发的那些事儿.阅读全文,大约需要8分钟. 什么是前后端分离 除了前端之外都属于后端了. 你负责貌美如花,我负责赚钱养家 在传统的像ASP,JSP和PHP等开发模式中,前端是处在一个混沌的状态中,可以说是没有独立的"人格"可言. 前端负责切图和编写静态页面模板,后端将数据渲染到前端提供的页面模板中,最后将页面渲染到浏览器展示. 这个过程中,前端只提供页面模板或者写一些JavaScript脚本,有的甚至JS脚本都是后端来写,前端的作用只局限

hdu1568&amp;&amp;hdu3117 求斐波那契数前四位和后四位

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1568 题意:如标题所示,求斐波那契数前四位,不足四位直接输出答案 斐波那契数列通式: 当n<=20的时候,不足四位,所以直接打表. 当n>20的时候,大于四位的时候,ans满足这个公式:ans=-0.5*log10(5.0)+num*1.0*log10((1+sqrt(5.0))/2.0); 这个公式是怎么来的呢?我们可以对an取10的对数,根据对数的性质. log10(ans)=log10(1/

Informatica 常用组件Source Qualifier之 会话前和会话后 SQL

  可以在源限定符转换的"属性"选项卡中添加会话前和会话后 SQL 命令.您可能要使用会话前 SQL 以在会话开始时将时间标识行写入源表. PowerCenter 在读取源之前对源数据库运行会话前 SQL 命令, 在写入目标之后对源数据库运行会话后 SQL 命令. 可以在会话属性"映射"选项卡上的"转换"视图中覆盖 SQL 命令.您还可以配置 PowerCenter 在运行会话前或会话后 SQL 命令遇到错误时是停止还是继续.      当您在源

重构前VS重构后效果对比

重构有用吗?真假见下图效果. 重构前: 重构后:

织梦栏目分页实现前十页后十页

栏目分页前十页后十页 实现教程 打开 /include/arc.listview.class.php 找到 $prepage.="<li><a href='".$purl."PageNo=$prepagenum'>上一页</a></li>\r\n"; 在它下面加入 $prepage.="<li><a href='".$purl."PageNo=". (($pre