以下は、バック エッジとツリー エッジをマークするためのロジックを含む DFS の一般的なコードです。私の疑問は、頂点からのバックエッジが戻って先祖を指し、親を指すバックエッジではないということです(無向グラフを想定しましょう)。無向グラフでは、2 つの頂点 x と y の間を前後にエッジがあります。したがって、y を処理するときに x にアクセスした後、y は隣接する頂点として x を持ちますが、既にアクセスしているため、コードはそれをバック エッジとしてマークします。
私がそう言うのは正しいですか?私の仮定が有効な場合に備えて、これを回避するために追加のロジックを追加する必要がありますか?
DFS(G)
for v in vertices[G] do
color[v] = white
parent[v]= nil
time = 0
for v in vertices[G] do
if color[v] = white then
DFS-Visit(v)
Induce a depth-rst tree on a graph starting at v.
DFS-Visit(v)
color[v]=gray
time=time + 1
discovery[v]=time
for a in Adj[v] do
if color[a] = white then
parent[a] = v
DFS-Visit(a)
v->a is a tree edge
elseif color[a] = grey then
v->a is a back edge
color[v] = black
time = time + 1
白い意味unexplored
、灰色の意味frontier
、黒の意味processed