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

如果我在计算强连通分量时不使用G转置呢?

臧彭亮
2023-03-14

我在读算法介绍。在22.5强连接组件中,算法强连接组件(G)定义为:

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

如果我把alogrithm改为只使用G,而不计算G转置。还要考虑按U.F增加的顺序(拓扑排序的逆序)排列的顶点:

  1. 调用DFS(G)计算每个顶点u的完成时间u.f
  2. 调用DFS(G),但在DFS的主循环中,按U.F增加的顺序考虑顶点(如第1行所计算)
  3. 输出第2行形成的深度优先森林中每棵树的顶点

为什么这个算法是错误的?

共有1个答案

尉迟禄
2023-03-14

你的问题实际上是书中的练习22.5-3。下面给出了一个反例来验证您的替代算法的正确性:http://sites.math.rutgers.edu/~ajl213/clrs/ch22.pdf

培根教授的建议行不通。作为一个例子,假设我们的图在三个顶点{1,2,3}上,并且由边(2,1),(2,3),(3,2)组成。然后,我们应该以{2,3}和{1}作为我们的SCC结束。但是,从2开始的DFS可能会在1之前探索3,这意味着3的完成时间低于1和2。这意味着当我们从3开始第一次执行DFS时。然而,从3开始的DFS将能够到达所有其他顶点。这意味着算法将返回整个图是单个SCC,尽管显然不是这样,因为从1到3中既没有从1到2的路径。

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

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

  • 利用广度优先搜索或深度优先搜索,在线性时间内(根据图的顶点和边的个数)计算图的连通分量是很简单的。在任何一种情况下,从某个特定顶点v开始的搜索都将在返回之前找到包含v(不再包含)的整个连通组件。若要找到图的所有连通分量,请循环遍历图的顶点,每当循环到达以前发现的连通分量中尚未包含的顶点时,就开始新的广度优先或深度优先搜索。 这个操作的运行时间是多少?我遇到过一些消息来源,说连接的组件是在时间内完成

  • 我正在努力自学图论,现在试图理解如何在图中找到SCC。我读过关于SO的几个不同的问题/答案(例如,1、2、3、4、5、6、7、8),但我找不到一个可以遵循的完整的一步一步的例子。 根据CORMEN(算法导论),一种方法是: 调用DFS(G)计算每个顶点u的完成时间f[u] 计算转置(G) 调用DFS(转置(G)),但在DFS的主循环中,按F[u]递减的顺序考虑顶点(如步骤1中计算的那样) 输出步骤

  • 如果您不知道SCC算法是如何工作的,请阅读本文:https://www.hackerearth.com/practice/algorithms/graphs/strong-connected-components/tutorial/(这是我能找到的最好的文章)。 在找到每个节点的完成时间后,将原图反转,从时间最高的节点开始运行DFS。如果我们从原始图中最小的节点开始运行DFS呢?为什么不管用?

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