[英]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。 如果存在母顶点,则必须是母顶点。
我们可以使用KOSARAJU算法在O(m + n)中找到母顶点
使用递归和堆栈来跟踪所有顶点的访问时间,请参见此链接以获取DFS。
这是在Graph中找到母顶点的算法,G =(VE):
对指定图形进行DFS遍历。 在遍历时,请跟踪最后完成的顶点“ v”。 此步骤需要O(V + E)时间。
如果存在母顶点,则“ v”必须为一个(或其中之一)。 通过从v执行DFS / BFS来检查v是否为母顶点。此步骤还需要O(V + E)时间。
geeksforgeeks.com的这篇文章是一个很好的起点/整体答案: 在图形中查找母顶点
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.