如何在O(n + m)中的有向图中找到母顶点?

时间:2010-11-30 07:57:03

标签: algorithm graph-theory

有向图中的母顶点G =(V,E)是顶点v,使得所有其他顶点 顶点G可以通过v的有向路径到达 给出O(n + m)算法来测试图G是否包含母顶点。

(c)来自Skiena手册

仅找到O(n(n + m))方式

7 个答案:

答案 0 :(得分:6)

谷歌搜索时,我实际上找到了答案here。如果这是作业,你应该在偷看之前三思而后行:)

答案 1 :(得分:2)

算法::

a)执行图表的 DFS / BFS 并跟踪最后完成的顶点' x'

b)如果存在任何母顶点,那么' x'是其中之一。检查是否' x'通过从顶点' x'进行 DFS / BFS ,它是一个母顶点。

时间复杂度O(n + m)+ O(n + m)= O(n + m)

答案 2 :(得分:1)

<强>步骤1 即可。对有向图的顶点进行拓扑排序。

<强>步骤2 即可。现在检查我们是否可以在步骤1中从拓扑排序顶点的第一个顶点到达所有顶点。

要执行步骤2,请再次初始化 array 发现[i] 为false,并从拓扑排序顶点的第一个节点执行dfs startin。

如果可以到达所有顶点,则图形具有母顶点,母顶点将是拓扑排序顶点的前一个。

时间复杂度:   step1需要O(n + m),第2步需要O(n + m)   总共O(n+m) + O(n+m) = O(n+m)

答案 3 :(得分:0)

我看到了解决方案。我认为我们不需要找到SCC。只需从随机顶点执行DFS,然后使用最后完成时间从顶点执行DFS。如果有一个母顶点那么它必须是这个。

答案 4 :(得分:0)

  1. 在图表上进行拓扑排序。示例:A C D E B
  2. 查找是否存在从拓扑顺序中的第一个节点到所有其他节点的路径 2.A.将从A到所有节点的距离初始化为无限,并将从A到A的距离初始化为0。 2.B.对于拓扑顺序中的所有节点,更新A中所有相邻节点的最短距离。
  3. 遍历所有节点以查看是否仍有一些无限距离。如果存在无限距离,则从A到该节点没有路径并返回false。
  4. 如果所有节点上的循环成功,则返回true。

答案 5 :(得分:0)

我们可以使用KOSARAJU算法在O(m + n)中找到母顶点

  1. 首先从任何顶点中找到DFS或BFS,并跟踪访问的顶点并将其推入堆栈。
  2. 如果顶部元素可以访问所有顶点,则它是母顶点,因此请再次应用DFS或BFS。

See this link for DFS using recursion and stack to track the visiting time of all vertices

  1. 因此从堆栈顶部开始访问,直到堆栈不为空为止。如果只有一个顶点未被访问,则不会存在母顶点。

答案 6 :(得分:0)

这里是在图形中查找母顶点的算法,G =(V.E):

  1. 执行给定图的DFS遍历。在遍历时,请跟踪最后完成的顶点“ v”。此步骤需要O(V + E)时间。

  2. 如果存在一个或多个母顶点,则“ v”必须为一个(或其中之一)。通过从v执行DFS / BFS来检查v是否为母顶点。此步骤还需要O(V + E)时间。