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

如何在图中找到强连通分量?

曹昊焱
2023-03-14

我正在努力自学图论,现在试图理解如何在图中找到SCC。我读过关于SO的几个不同的问题/答案(例如,1、2、3、4、5、6、7、8),但我找不到一个可以遵循的完整的一步一步的例子。

根据CORMEN(算法导论),一种方法是:

  1. 调用DFS(G)计算每个顶点u的完成时间f[u]
  2. 计算转置(G)
  3. 调用DFS(转置(G)),但在DFS的主循环中,按F[u]递减的顺序考虑顶点(如步骤1中计算的那样)
  4. 输出步骤3的深度优先森林中每棵树的顶点作为单独的强连通分量

从顶点A开始运行DFS:

请注意红色文本格式为[访问前,访问后]

步骤2:计算转置(G)

    null

所以我们有五个强连通分量:{E},{B},{A},{H,I,G},{C,J,F,D}

共有1个答案

岳阳文
2023-03-14

您的步骤是正确的,您的答案也是正确的,通过检查您提供的其他答案,您可以看到他们使用了一个不同的算法:首先,您对G转置运行DFS,然后您对G运行一个无向组件算法,从上一步开始,按照顶点的投递数递减的顺序处理顶点。

问题是,他们在G上执行最后一步,换位而不是在G中,因此得到了一个不一致的答案。如果你从第98页开始阅读Dasgupta,你会看到他们(试图)使用的算法的详细解释。

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

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

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

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

  • 到目前为止,我已经使用了下面的算法来寻找图的强连通分量。 > 调用DFS(G)计算每个顶点v的完成时间F[v],对G的顶点按完成时间递减的顺序排序; 计算G的转置GT;

  • 在本章的剩余部分,我们将把注意力转向一些非常大的图。我们将用来研究一些附加算法的图,由互联网上的主机之间的连接和网页之间的链接产生的图。 我们将从网页开始。 像 Google 和 Bing 这样的搜索引擎利用了网页上的页面形成非常大的有向图。 为了将万维网变换为图,我们将把一个页面视为一个顶点,并将页面上的超链接作为将一个顶点连接到另一个顶点的边缘。 Figure 30 展示了从 Luther C