繁体   English   中英

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

[英]How to find mother vertex in a directed graph in O(n+m)?

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

(c)从Skiena手册

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

谷歌搜索时,我实际上在这里找到了答案。 如果这是家庭作业,则在偷看之前应该三思:)

算法::

a)对图进行DFS / BFS并跟踪最后完成的顶点“ x”。

b)如果存在任何母顶点,则“ x”是其中之一。 通过从顶点“ x”执行DFS / BFS ,检查“ x”是否为母顶点。

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

步骤1 对有向图的顶点进行拓扑排序。

第二步 现在检查在步骤1中是否可以从拓扑排序的顶点的第一个顶点到达所有顶点。

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

如果可以到达所有顶点,则图具有母顶点,并且母顶点将成为拓扑排序的顶点的前者。

时间复杂度:步骤1取O(n + m) ,步骤2取O(n + m)所以总O(n+m) + O(n+m) = O(n+m)

我看到了解决方案。 我认为我们不需要找到SCC。 只需从随机顶点进行DFS,然后在最后完成时间从顶点进行DFS。 如果存在母顶点,则必须是母顶点。

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

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

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

使用递归和堆栈来跟踪所有顶点的访问时间,请参见此链接以获取DFS。

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

这是在Graph中找到母顶点的算法,G =(VE):

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

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

geeksforgeeks.com的这篇文章是一个很好的起点/整体答案: 在图形中查找母顶点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM