Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/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 创建检查图形是否连接的算法_Algorithm_Search_Graph_Time Complexity_Big O - Fatal编程技术网

Algorithm 创建检查图形是否连接的算法

Algorithm 创建检查图形是否连接的算法,algorithm,search,graph,time-complexity,big-o,Algorithm,Search,Graph,Time Complexity,Big O,于是一道老试题就这样被问出来了。 我想知道这意味着什么,因为一个图可以被定向或不定向。在有向图中,它应该是这样工作的(我猜): 创建两个数组:A[],A_inverse[]//大小均为N(存在N个节点),两个数组均以NULL初始化 在图G上运行深度优先搜索 将访问的所有节点保存在[]中 如果(A.size

于是一道老试题就这样被问出来了。 我想知道这意味着什么,因为一个图可以被定向或不定向。在有向图中,它应该是这样工作的(我猜):

创建两个数组:A[],A_inverse[]//大小均为N(存在N个节点),两个数组均以NULL初始化
在图G上运行深度优先搜索
将访问的所有节点保存在[]中
如果(A.size<|N |)返回false
G'=反转G的所有边
在图G'上运行深度优先搜索
保存在\u inverse[]中所有已访问的节点
如果(A_inverse.size<|N |)返回false
返回真值
时间复杂度为T(N)=2*DFS+| E |+c。2*DFS,因为我打了两次电话(一次给G,一次给G')|因为我需要反转所有边。c是所有条件和初始化。
我的算法正确吗

在强连通图G中,从任何节点a到任何(其他)节点B都必须有一条路径

首先,请注意翻转图G’中有一条从B到a的路径,当且仅当原始图G中有一条从a到B的路径时

假设DFS从某个源节点O开始

首先,我们证明了如果G是强连通的,那么算法返回true

  • 第一个DFS将到达所有节点,因为假设存在从O到每个其他节点的路径
  • 再一次假设,从每个节点到O都有一条路径。在G'(所有边都翻转)中,有一条从O到其他节点的路径。因此,第二个DFS也将到达所有节点,并且算法返回true

现在考虑一个不强连接的图G,即,有一对节点(A,B),使得从A到B不存在路径。我们必须表明算法返回false。有两种情况需要考虑:

  • 没有从A到O的路径。在这种情况下,翻转图G'不能包含从O到A的路径。因此,第二个DFS将不会从O到达A,并且算法返回false
  • 有一条从a到O的路径:在这种情况下,不可能有一条从O到B的路径,因为如果有,我们假设没有从a到B的路径是错误的。由于没有从O到B的路径,第一个DFS将不会从O到达B,并且算法返回false

我们证明了如果G是强连通的,则该算法返回true,否则返回false。因此,这是正确的。

对于有向图,您使用的“连接”是什么;该算法应该测试它是强连通还是弱连通?@kaya3根据该算法,它似乎是弱连通的测试。这个“反向边”不应该证明它是强连通的,因为
u
以一种方式到达
v
,而
v
以另一种方式到达
u
(反向边),但是
v
不一定以原始边到达
u
。如果它不是强连通的,则算法返回false。如果强连接,则返回true@daniel我们的示例应该适用于该算法。如果v可以访问,那么如果图是强连通的,则在反转后应该再次访问它。它不必使用“原件”“边。如果某个对象是强连通的,则可以在反转后再次访问它。这是强连通图的特征之一。我的算法不适用于弱连通图。因此,该算法只是解决了将有向图转换为无向图的问题?否,它检查有向图是否是强连通图。”不管你是不是被绑架了。
Create two Arrays: A[], A_inverse[] //both in size N (N nodes exists), both arrays initalized with NULL
Run depth-first search on Graph G
     save in A[] all Nodes which are visted
         If(A.size < |N|) return false
G' = Reverse all edges of G
Run depth-first search on Graph G'  
     save in A_inverse[] all Nodes which are visted
         If(A_inverse.size < |N|) return false
return true