Algorithm 图的边
为了找到图的边类型,我们应用了深度优先搜索算法,我们可以使用: 树边:当[d[y],f[y]]⊂ [d[x],f[x]] 前进边:当[d[x],f[x]]时x->y⊂ [d[y],f[y]] 后缘:x->y当[d[y],f[y]]⊂ [d[x],f[x]] 交叉边:当[d[x],f[x]]∩ [d[y],f[y]]=∅ 发现时间:发现时间d[v]是在第一次看到v之前发现或完成的节点数 Finishing Time(完成时间):完成时间f[v]是在完成扩展$v$之前发现或完成的节点数 这就是我看到的图表: 以下是我发现的发现和完成时间: 算法:Algorithm 图的边,algorithm,depth-first-search,edges,Algorithm,Depth First Search,Edges,为了找到图的边类型,我们应用了深度优先搜索算法,我们可以使用: 树边:当[d[y],f[y]]⊂ [d[x],f[x]] 前进边:当[d[x],f[x]]时x->y⊂ [d[y],f[y]] 后缘:x->y当[d[y],f[y]]⊂ [d[x],f[x]] 交叉边:当[d[x],f[x]]∩ [d[y],f[y]]=∅ 发现时间:发现时间d[v]是在第一次看到v之前发现或完成的节点数 Finishing Time(完成时间):完成时间f[v]是在完成扩展$v$之前发现或完成的节点数 这就是我看到
Depthfirstsearch(G)
for each v ∈ V
color[v]=white
p[v]=NIL
time=0
for each v ∈ V
if color[v]=white then
Visit(v)
Visit(u)
color[u]=gray
time=time+1
d[u]=time
for each v ∈ Adj[u]
if color[v]=white then
p[v]=u
Visit(v)
color[u]=black
time=time+1
f[u]=time
例如,当我们有[d[y],f[y]]⊂ [d[x],f[x]]我们怎么知道它是树边还是后边
我们是否必须标记每个节点的父节点,如下所示:
如果有红边,我们知道它是树边?如果是,你能解释一下原因吗
另外,jh、ia前边缘和ag不是后边缘吗?还是我错了?您的前后边缘关系不正确-您应该交换它们。
除此之外,我建议阅读维基百科的这一段:
它包括对这些边的更直观和直接的定义以及一幅好的图片: 直接回答你的问题 例如,当我们有[d[y],f[y]]⊂ [d[x],f[x]]我们怎么能 知道它是树的边缘还是前进的边缘 如果一条边属于树-它是一条树边(所有树边满足上述关系)。
如果一条边不属于树和它满足上述关系-它是一条向前的边 我们是否必须标记每个节点的父节点,如:[…]如果有红边,我们知道它是树边 是的,但是我们需要记住树的边是蓝色的,红色的边只是树的一个表示,它们指向另一个方向。因此,如果有一个红色箭头
x->y
,这意味着一个蓝色箭头y->x
属于树(这对您来说可能很明显)。您还可以阅读生成树的定义:另外,jh、ia前边缘和ag不是后边缘吗?还是我错了 恰恰相反:jh、ia是后边缘,ag是前边缘(因为您的后边缘和前边缘关系不正确) 更长的解释 在图形上运行DFS时,它通过在
Visit(u)
中设置p[v]=u
(这意味着顶点u
是输入图形生成树中顶点v
的父级)来生成此图形的生成树的表示
您已使用红色箭头正确绘制此表示。然而,真正形成一个图的生成树的是这个图的边(确切地说是它们的子集)。因此,要知道图的蓝色x->y
边是否属于该图的生成树,我们需要检查图片中是否有y->x
红色边,或者换句话说,如果x
是生成树中y
(p[y]==x
)的父项
让我们找出为什么jh
是后缘。我们需要看看你的第二张照片:
DFS在
a
中启动。在访问顶点c、f、g
后,它会回溯到a
并第一次访问d
(这会将边a->d添加到DFS正在构建的生成树中)。然后,它访问了h,j
,现在它想访问h
,但它已经被访问过了,h
的发现时间比j
要短,所以我们正在后退-这是一个后缘。我明白了。。。但是,你能进一步解释为什么如果x是y的父元素,那么边x->y是树的边吗?另外,我正在看的练习要求我展示深度优先搜索如何在图形上工作。那么,我必须编写执行的命令,还是只需在节点处编写发现和完成时间,并在图中添加红色箭头?我不确定您是否理解树和生成树是什么?暂时忘掉父对象,看看这张pdf的第3页(有一个树边的定义):在练习中,你需要画一张像我从维基百科粘贴的图片——只需写下顶点的发现时间,并将边标记为tree/forward/back/cross。如果你能画出来,这表明你知道DFS是如何工作的。你能看看这个吗?