当前位置: 首页 > 知识库问答 >
问题:

用DFS求图中的强连通分量

段干玺
2023-03-14

我在读关于BFS和DFS的图算法。当我在分析用DFS寻找图中强连通分量的算法时,我产生了一个疑问。为了寻找强连通分量,book(Coremen)首先在图上运行DFS,以得到顶点的完成时间,然后在图的转置上按照第一个DFS得到的完成时间的递减顺序运行DFS。但是我不能理解为什么第二个DFS必须按照完成时间运行。我的意思是,即使我们直接在图的转置上运行DFS(忽略完成时间),它也会给我们连接的组件吗?因为通过转置,我们已经阻塞了通往其他组件的路径。

共有1个答案

杨选
2023-03-14

编辑-这里有一些来自斯坦福大学的关于这个主题的好的深入视频:

http://openclassroom.stanford.edu/mainfolder/coursepage.php?course=introtoalgorithms(参见6.有向图中的连通性)

我的解释是:

DFS(G)
1 for each vertex u in G.V
2     u.color = WHITE
3     u.π = NIL
4 time = 0
5 for each vertex u in G.V
6     if u.color == WHITE
7         DFS-VISIT(G, u)

DFS-VISIT(G, u)
1 time = time + 1 // white vertex u has just been discovered
2 u.d = time
3 u.color = GRAY
4 for each v in G.adj[u]
5     if v.color == WHITE
6         v.π = u
7         DFS-VISIT(G, u)
8 u.color = BLACK // blacken u; it is finished
9 time = time + 1
10 u.f = time
 类似资料:
  • 到目前为止,我已经使用了下面的算法来寻找图的强连通分量。 > 调用DFS(G)计算每个顶点v的完成时间F[v],对G的顶点按完成时间递减的顺序排序; 计算G的转置GT;

  • 我不太确定这是不是解决办法,有人能帮我弄清楚吗? 谢谢!

  • 我想在无向图中找到一个强连通分量,即如果我从一个节点开始,那么我将回到节点,并且每个边都被精确地访问一次。 对于有向图,可以用Tarjan算法求强连通分量,但是对于无向图,该怎么办。

  • 我有一个强连通图。我想移除一个边并检查是否仍然保持强连接。因为我将N=图中节点的总数取为10,并且我感兴趣的大多数图都有25条以上的边,所以很难检查一次使用一条,去掉边。 如何解决这个问题?多谢了。

  • 输出应该如下所示: 我甚至不知道为什么会有这样的错误。我将代码从https://www.geeksforgeeks.org/tarjan-algorithm-find-strong-connected-components/改为我的代码,并添加了input机会。我问过这个问题,一个朋友说:“这是addEdge方法中添加w后的两个代码的输出,在您的代码中w添加到所有元素中,而在原始代码中只添加到图V

  • 2)从任意顶点开始对图进行DFS遍历。如果DFS遍历没有遍历所有顶点,则返回false。 3)求所有弧的反向(或求图的转置或反向) 4)在反向图中,将所有顶点标记为未访问顶点。 有没有关于如何改进这个解决方案的想法?。