我在读算法介绍。在22.5强连接组件中,算法强连接组件(G)定义为:
如果我把alogrithm改为只使用G,而不计算G转置。还要考虑按U.F增加的顺序(拓扑排序的逆序)排列的顶点:
为什么这个算法是错误的?
你的问题实际上是书中的练习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(忽略完成时间),它也会给我们连接的组件吗?