边的分类
G ( V , E ) G(V,E) G(V,E)在基于深搜定义下的前驱子图 G π G_\pi Gπ(又称深度优先森林)中定义了四种类型的边:
树边
均为深度优先森林的边( E π E_\pi Eπ);后向边
为 E E E中非树边且将节点连向祖先节点的边(自循环的边被认为是后向边);前向边
为后向边的反向描述,连接向后代节点的边;横向边
为所有其他类型的边,包含同一树中非祖先、深搜森林中连接两棵树的边等等;
对应上节验证括号化定理的深搜的前驱子图可以得出,粗线描述的都为树边构成了前驱子图,标注为B
为的是连接祖先的后向边,标注F
是连接后代的前向边,而标注C
的是横向边。
其中书中讨论的情况为:搜索过程中第一次探索 ( u , v ) (u,v) (u,v)边时,通过节点颜色可以得出该边的类型:
-
节点
v
为白色:树边;情况很容易得证,因为白色时会被添加到前驱子图使得 ( u , v ) ∈ E π (u,v)\in E_\pi (u,v)∈Eπ。
-
节点
v
为灰色:后向边;不同于书中讨论:当在搜索中访问相邻节点只会有两个状态:
- 访问节点为图中其他搜索树的节点,那么因为当前的树搜索未完成,其他树的状态有两种,一种是整棵树未被搜索节点为白色,这时可以将访问到的节点归纳到当前节点所在的树中;另一种情况是访问节点所在的树已经被搜索过,那么树的颜色应为黑色,与上述条件不符;
- 访问节点为图中当前搜索树的节点,有两种状态,若为白色时这种情况归纳到第一种情况为树边;若为灰色时说明找到了该树中搜索还未回溯的节点
x
x
x且节点
x
x
x通过递归调用搜索找到了当前节点并形成了环访问回到了
x
x
x,这是可以证明
x
为节点v
的祖先;若节点为黑色说明访问到的节点不是当前搜索树,与前提矛盾不考虑。
-
节点
v
为黑色:前向边或横向边;依旧分为两种可能性:
- 若是一棵树中的节点,分为了两类情况,一类为上图 s → w s\rightarrow w s→w的指向后代的前向边,另一类是 w → x w\rightarrow x w→x没有直系亲缘关系的横向边;
- 若不是一棵树中的节点,那么就只能归类为横向边。
在上述过程中的问题是深搜算法是一个在应用中全局搜索找答案的方法,所以边的性质可能不是唯一的,要针对顶点链表的顺序去看,但上述边的分类是基于深搜后的前驱子图的而不是待搜索的图。
[定理]在无向图搜索中,任意一条边要么是树边,要么是后向边。
搜索边
(
u
,
v
)
(u,v)
(u,v)的过程中,若节点v
未被搜索过,那么根据上述判断边
(
u
,
v
)
(u,v)
(u,v)为树边;反之如果节点v
被搜索过那么说明算法通过
(
v
,
u
)
(v,u)
(v,u)完成了第一次搜索,则u
为后代,边
(
u
,
v
)
(u,v)
(u,v)为一条连接祖先的后向边。
问题:
(
u
,
v
)
(u,v)
(u,v)在访问节点v
为黑色时有性质:
u
.
d
<
v
.
d
u.d<v.d
u.d<v.d时边为前向边,
u
.
d
>
v
.
d
u.d>v.d
u.d>v.d时边为横向边。
色时有性质: u . d < v . d u.d<v.d u.d<v.d时边为前向边, u . d > v . d u.d>v.d u.d>v.d时边为横向边。
该问题情况三的讨论1中做了举例描述,可以尝试进行证明。