在DFS中,您可以通过初始化两个计数器并在DFS-VISIT过程中递增它们来计算元素(每次调用过程时+1节点,每次探查邻接列表时+1弧)。我想知道如何在BFS中获得相同的结果。 这是来自Cormen的“算法导论”的BFS伪代码,其中G是图,s是源节点,d是距离,π是父节点。如何修改它以获得G?
中的节点数和弧数BFS(G, s)
for each node u ∈ G.V - {s}
u.color = white
u.d = ∞
u.π = NIL
s.color = GRAY
s.d = 0
s.π = NIL
Q = Ø
ENQUEUE(Q, s)
while Q != Ø
u = DEQUEUE(Q)
for each v ∈ G.Adj[u]
if v.color == WHITE
v.color = GRAY
v.d = u.d + 1
v.π = u
ENQUEUE(Q, v)
u.color = BLACK
答案 0 :(得分:0)
嗯,邻接列表遍历和新顶点(节点)发现都是在伪代码的最后while循环中完成的。因此,类似下面给出的修改可能有用。
numArcs = 0
numNodes = 0
while Q != Ø
u = DEQUEUE(Q)
numNodes += 1
for each v ∈ G.Adj[u]
numArcs += 1
if v.color == WHITE
v.color = GRAY
v.d = u.d + 1
v.π = u
ENQUEUE(Q, v)
u.color = BLACK
请注意,如果要计算所有弧,numArcs
的增量应该在其后面的if语句的范围之外,因为if语句仅在目标节点先前未入队时输入
另请注意,此算法仅提供连接组件中的弧和节点数,包括起始节点s
。因此,除非修改BFS算法以处理具有多个连接组件的图形的情况,否则此算法将无法找到未连接的图形中的所有节点和弧。