当我在图表上使用BFS算法时,我尝试获取图表的最大深度。
但我不知道在这个算法中将增量放在哪里:
FUNCTION BFS(G,s)
BEGIN
FOR any vertex v of G
DO Mark[v] ← False
END FOR Mark[s] ← True
F ← Empty Queue
enqueue(s,F)
WHILE F is not empty
DO v ← dequeue(F)
FOR any vertex w neighbor of v
DO
IF Mark[w] = False THEN
Mark[w] ← True;
enqueue(w,F)
END IF
FOR END
WHILE END
我尝试在END FOR之后添加一个数字,但它给出的数字优于图表的实际最大深度。
请任何人帮助我。
谢谢。
答案 0 :(得分:1)
在图表上运行BFS会为您提供一棵树,您实际需要的是树的深度。在END FOR之后加上一个增量绝对会给你一个大于树深度的数字(取决于你的代码)。想象一下这种情况:访问当前顶点'v'的所有邻居(所有邻居都标记为true),这意味着顶点v leaf 但是你的增量仍会增加1,这不是正确。
解决方案:只有当前 v 时,您的增量才会增加至少有一个邻居 w 尚未访问(标记为并且你还没有增加同一级别的任何其他顶点(与根的's'相同距离的顶点)的深度,而不是 w 。因此,您在代码中缺少的是您应该跟踪代码中的级别以了解何时增加。
此问题已经被要求提供一个树,因此您可能需要查看此How to keep track of depth in breadth first search?,以告知您如何更新代码以跟踪关卡。简单的想法是在每个级别结束时将NULL推送到队列。根本身位于level0,因此在将root推送到队列之后,也推送NULL。之后,每次遇到NULL时,将NULL推送到下一级别的队列,并检查队列顶部是否为NULL,将深度增加1并继续其他中断。
FUNCTION BFS(G,s)
BEGIN
FOR any vertex v of G DO
Mark[v] ← False
END FOR
Mark[s] ← True
F ← Empty Queue
depth=0
enqueue(s,F), enqueue(NULL,F) // this is the level 0
WHILE F is not empty DO
v ← dequeue(F)
IF v=NULL THEN
enqueue(NULL,F)
IF(F.peek()==NULL) THEN
BREAK
ELSE
depth++
Continue
FOR any vertex w neighbor of v DO
IF Mark[w] = False THEN
Mark[w] ← True;
enqueue(w,F)
END IF
FOR END
WHILE END
答案 1 :(得分:0)
我的朋友找到了这个解决方案:
FUNCTION BFS(G,s)
BEGIN
FOR any vertex v of G
DO Mark[v] ← False
END FOR Mark[s] ← True
F ← Empty Queue
DIST [] ← Empty Tab
COUNTER = 0
enqueue(s,F)
WHILE F is not empty
DO v ← dequeue(F)
DIST[v] ← 0
FOR any vertex w neighbor of v
DO
IF Mark[w] = False THEN
Mark[w] ← True;
enqueue(w,F)
DIST[w] ← DIST[v] + 1
IF [COUNTER < DIST[w]] THEN
COUNTER = DIST[w];
END IF
END IF
FOR END
WHILE END
RETURN (COUNTER);
END FUNCTION
我在4月26日3点36分Abdulhakeem的评论之后编辑了这个答案,因为我发布了错误的评论。