如何使用BFS获取图形的最大深度

时间:2017-04-17 19:21:44

标签: max graph-theory graph-algorithm breadth-first-search depth

当我在图表上使用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之后添加一个数字,但它给出的数字优于图表的实际最大深度。

请任何人帮助我。

谢谢。

2 个答案:

答案 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的评论之后编辑了这个答案,因为我发布了错误的评论。