在深度优先的树中,有定义树的边(即遍历中使用的边)。
有一些剩余的边缘连接其他一些节点。交叉边缘和前边缘有什么区别?
从维基百科:
基于此生成树,原始图的边缘可分为三类:前向边缘(从树的节点指向其后代之一),后边缘(从节点到其祖先之一),和交叉边缘,两者都不起作用。有时,属于生成树本身的树边缘与前边缘分开进行分类。如果原始图形是无向的,则其所有边缘均为树形边缘或后边缘。
从一个节点指向另一个节点的遍历中未使用的边线是否不建立父子关系?
在深度优先的树中,有定义树的边(即遍历中使用的边)。
有一些剩余的边缘连接其他一些节点。交叉边缘和前边缘有什么区别?
从维基百科:
基于此生成树,原始图的边缘可分为三类:前向边缘(从树的节点指向其后代之一),后边缘(从节点到其祖先之一),和交叉边缘,两者都不起作用。有时,属于生成树本身的树边缘与前边缘分开进行分类。如果原始图形是无向的,则其所有边缘均为树形边缘或后边缘。
从一个节点指向另一个节点的遍历中未使用的边线是否不建立父子关系?
Answers:
维基百科有答案:
所有类型的边缘均出现在此图片中。在此图上找出DFS(按数字顺序浏览节点),然后查看直觉失败的地方。
这将解释该图:
前缘:(u,v),其中v是u的后代,但不是树的边缘,它是将顶点连接到DFS树中的后代的非树的边缘。
交叉边缘:任何其他边缘。可以在相同的深度优先树或不同深度优先树中的顶点之间移动。(layman)
它是图形G中的任何其他边。它连接两个不同DFS树中的顶点或同一DFS树中的两个顶点,两者都不是另一个祖先。(正式)
在无向图中遍历DFS不会留下交叉边缘,因为会探索入射在顶点上的所有边缘。
但是,在有向图中,您可能会遇到一条导致先前已发现的顶点的边,从而该顶点不是当前顶点的祖先或后代。这样的边缘称为十字边缘。
在DFS遍历中,节点的所有子节点完成后,节点也将完成。如果在遍历期间标记每个节点的发现和完成时间,则可以通过比较开始时间和结束时间来检查节点是否为后代。实际上,任何DFS遍历都会根据以下规则对其边缘进行分区。
令d [node]为节点的发现时间,同样令f [node]为完成时间。
括号定理对于所有u,v,恰好满足以下条件之一:
1. d [u] <f [u] <d [v] <f [v]或d [v] <f [v] <d [u ] <f [u]并且u和v都不是另一个的后代。
d [u] <d [v] <f [v] <f [u]并且v是u的后代。
d [v] <d [u] <f [u] <f [v]并且u是v的后代。
因此,d [u] <d [v] <f [u] <f [v]不会发生。
像括号一样:()[],([])和[()]可以,但是([]]和[(])不能。
例如,考虑带有边的图形:
A-> B
A-> C
B-> C
让访问顺序由一串节点标签表示,其中“ ABCCBA”表示A-> B-> C(完成)B(完成)A(完成),类似于((()))。
因此,“ ACCBBA”可以是“(()())”的模型。
示例:
“ CCABBA”:由于CC不在A的内部,所以A-> C是一个交叉边
。
“ ACCBBA”:那么A-> C是树的边缘(直接后代)。
来源:
CLRS:
https:
//mitpress.mit.edu/books/introduction-algorithms讲义笔记http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/GraphAlgor/depthSearch.htm