Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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_Depth First Search_Topological Sort - Fatal编程技术网

Algorithm 如果拓扑排序使用DFS,它如何在断开连接的图上成功?

Algorithm 如果拓扑排序使用DFS,它如何在断开连接的图上成功?,algorithm,graph,depth-first-search,topological-sort,Algorithm,Graph,Depth First Search,Topological Sort,我的知识有差距,但我不确定具体在哪里。拓扑排序可以使用深度优先搜索完成,如下所示。然而,我只见过对树实施深度优先搜索,其中拓扑排序是针对DAG的 树是否是DAG的特例,其中边的隐含方向是从根节点向下 用于拓扑排序的算法是否不是真正的DFS算法,而是非常类似的算法 例如,拓扑排序可以处理断开连接的图形,其中DFS无法遍历没有连接它的边的节点…可以吗?因为用于拓扑排序时,您对每个节点执行DFS。如果其中一个孩子已经被以前的DFS访问(黑色)。然后,它已经被推送到输出向量中,所以依赖关系已经完成 引用

我的知识有差距,但我不确定具体在哪里。拓扑排序可以使用深度优先搜索完成,如下所示。然而,我只见过对树实施深度优先搜索,其中拓扑排序是针对DAG的

  • 树是否是DAG的特例,其中边的隐含方向是从根节点向下
  • 用于拓扑排序的算法是否不是真正的DFS算法,而是非常类似的算法

  • 例如,拓扑排序可以处理断开连接的图形,其中DFS无法遍历没有连接它的边的节点…可以吗?

    因为用于拓扑排序时,您对每个节点执行DFS。如果其中一个孩子已经被以前的DFS访问(黑色)。然后,它已经被推送到输出向量中,所以依赖关系已经完成

    引用您的链接(强调我的链接):

    该算法以任意顺序循环通过图的每个节点,启动深度优先搜索

    由于维基百科的文章有点令人困惑(在我看来),我将尝试更好地描述算法:

         V: set of vertices
         E: set of edges
         E.adj(v): set of vertices adjacent to vertex v
    
     0 function topological_sort(V,E):
     1   for v in V:
     2     paint v white
     3
     4   for v in V:
     5     if v is white:
     6       dfs(v)
    
     7 function dfs(v):
     8   paint v grey
     9   for child in E.adj(v)
    10     if child is white:
    11       dfs(child)
    12   paint v black
    13   push v to output
    
    我们可以轻松计算复杂性:

    • 我们在每个顶点上绘制一次顶点白色、灰色和黑色:
      O(V)
    • 我们对每个顶点检查一次第
      5行的顶点颜色:
      O(V)
    • 我们每边检查一次线
      10
      处顶点的颜色:
      O(E)
    • 我们将顶点按每个顶点一次,在第
      13行输出:
      O(V)
    所以最后的复杂性是:
    O(V+E)
    。它相当有效


    该算法的优点之一是不需要修改输入图。我们可以通过大小为
    O(V)
    的临时哈希表轻松实现着色。其他一些拓扑排序算法需要在继续时销毁图(通过删除边)。如果排序后仍需要图形,则需要在运行toplogical排序之前复制图形。

    您可能希望尝试向图形中添加新的“源”节点,并将其与具有定向边的每个其他节点连接。然后从此新节点开始搜索/遍历。此方法可能适合您的需要,也可能不适合您的需要。

    您在每个节点上执行DFS是什么意思?你是说对于一个有n个节点的图,你会运行DFS n次吗?没错。但是,这一点很重要,如果您遇到一个节点已被以前的DFS调用涂成黑色,则停止深入。尽管如此,这似乎非常低效,甚至无法初始化DFS n次。您最多访问一次每个节点,最多访问一次每个边。@SamShen在这种特定情况下,这并不重要。通常,当你做DFS时,你想知道灰色节点和黑色节点之间的区别。不要忘记接受答案,或者解释你收到的答案中不清楚的地方。