Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 通过DFS查找图中的强连通组件_Algorithm_Graph - Fatal编程技术网

Algorithm 通过DFS查找图中的强连通组件

Algorithm 通过DFS查找图中的强连通组件,algorithm,graph,Algorithm,Graph,我在读关于BFS和DFS的图形算法。当我分析通过DFS在图中查找强连通分量的算法时,我的脑海中出现了一个疑问。为了找到强连接的组件,book(Coremen)所做的是,首先在图上运行DFS,以获得顶点的完成时间,然后再次在图的转置上运行DFS,按照我们从第一个DFS获得的完成时间的降序。但我无法理解为什么第二个DFS必须按照完成时间运行。 我的意思是,即使我们直接在图的转置上运行DFS(忽略完成时间),它也会给我们连接的组件,因为通过转置,我们已经阻塞了到其他组件的路径 编辑-以下是斯坦福大学关

我在读关于BFS和DFS的图形算法。当我分析通过DFS在图中查找强连通分量的算法时,我的脑海中出现了一个疑问。为了找到强连接的组件,book(Coremen)所做的是,首先在图上运行DFS,以获得顶点的完成时间,然后再次在图的转置上运行DFS,按照我们从第一个DFS获得的完成时间的降序。但我无法理解为什么第二个DFS必须按照完成时间运行。
我的意思是,即使我们直接在图的转置上运行DFS(忽略完成时间),它也会给我们连接的组件,因为通过转置,我们已经阻塞了到其他组件的路径

编辑-以下是斯坦福大学关于该主题的一些好的深入视频:

(参见6.有向图中的连通性)

我的解释是:

如果不根据第一个dfs的完成时间减少而运行第二个dfs,则可能会错误地将整个图形标识为单个强连接组件(SCC)

请注意,在我的示例中,节点
d
从第一个dfs开始始终具有最低的完成时间。节点
a
b
c
中的一个将具有最高的完成时间。让我们假设
a
具有最高的完成时间,因此如果我们根据减少的完成时间运行第二个dfs,
a
将是第一个

现在,如果在
G
的转置中运行以node
d
开始的第二个dfs,您将生成一个包含整个图的深度优先林,因此得出结论,整个图是一个SCC,这显然是错误的。但是,如果您以
a
启动dfs,那么您不仅会发现
a
b
c
是一个SCC,而且重要的是它们会被标记为灰色或黑色。然后,当您在
d
上继续dfs时,您将不会遍历出其SCC,因为您将意识到其相邻节点已被访问

如果你看一下科尔曼的DFS代码

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的第6行将只为true一次,因为DFS-VISIT将递归访问整个图形。这将在深度优先林中生成一棵树,每棵树都是一个SCC。对于一棵树的推理是因为一棵树是通过它的根节点有一个nil前导来识别的

该视频不可用,请在Coursera视频中详细解释,请查看-