为了找到那种图形的边缘,在此我们采用了深度优先搜索算法,我们可以这样做:
树边:X - >ÿ当[d [Y]中,f [Y]]⊂[d [X]中,f [X]]
前边缘:X - >ÿ当[d [X]中,f [X]]⊂[d [Y]中,f [Y]]
后边缘:X - >ÿ当[d [Y]中,f [Y]]⊂[d [X]中,f [X]]
横边缘:X - >ÿ当[d [X]中,f [X]]∩[d [Y]中,f [Y]] =∅
发现时间 :发现时间d [V]是第一次看到v在发现或完成节点的数量。
完成时间 :完成时间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后缘? 还是我错了?
您的前进和后退边的关系是不正确的 - 你应该换的。
除此之外,我建议阅读维基百科这样一段话:
http://en.wikipedia.org/wiki/Depth-first_search#Output_of_a_depth-first_search
它包括这些边缘和良好的图像的更直观的和直接的定义:
直接回答您的问题
当我们的情况为例[d [Y],F [Y]⊂[d [X],F [X],我们怎么能知道,如果它是树的边缘或前缘 ?
如果一个边缘属于树 - 它是树边缘(和所有树边缘满足上述的关系)。
如果边缘不属于树,它满足上面的关系-这是一个前边缘。
我们是否有标记每个节点的父亲,这样的:[...]如果有红边,我们知道,这是树的边缘?
是的,但我们需要记住,树边是蓝色和红色边的树只是一种表象,他们在另一个方向指向。 所以,如果有一个红色箭头x -> y
,这意味着一个蓝色箭头y -> x
属于树(它可能是你明显)。 您还可以读取生成树的定义:
http://en.wikipedia.org/wiki/Spanning_tree#Definitions
另外,也没有JH,IA前边缘和Ag后缘? 还是我错了?
这正是周围的其他方法:JH,IA回来边缘,AG是一家前缘(因为你的背部和前部边缘的关系是不正确的)。
更详细的解释
当你在图上运行DFS时,它产生此图的生成树的表示通过设置p[v]=u
在Visit(u)
这意味着顶点u
是顶点的父v
中的生成树输入图)。
你已经绘制正确使用红色箭头这种表示。 然而,究竟是什么形成了一个图的生成树是该图(或其中的一个子集,以准确)的边缘。 因此,要知道,如果一个蓝色的x -> y
图形的边缘属于这个图的生成树,我们需要检查,如果有一个y -> x
的红色边缘,您的图片,或者换句话说,如果x
是的父y
( p[y] == x
在生成树)。
让我们来看看为什么jh
是后缘。 我们需要看你的第二个画面:
在DFS开始于a
。 它已访问的顶点后c,f,g
它回溯到a
和访问d
首次(这增加了边缘- > d生成树的DFS正在建设)。 然后,访问h,j
,现在它想参观h
,但是它已经被访问和h
具有较小的发现时间比j
,所以我们搬回-这是一个底部。