有向图中的母顶点G =(V,E)是顶点v,使得所有其他顶点 顶点G可以通过v的有向路径到达 给出O(n + m)算法来测试图G是否包含母顶点。
(c)来自Skiena手册
仅找到O(n(n + m))方式
答案 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)
答案 5 :(得分:0)
我们可以使用KOSARAJU算法在O(m + n)中找到母顶点
See this link for DFS using recursion and stack to track the visiting time of all vertices
答案 6 :(得分:0)
这里是在图形中查找母顶点的算法,G =(V.E):
执行给定图的DFS遍历。在遍历时,请跟踪最后完成的顶点“ v”。此步骤需要O(V + E)时间。
如果存在一个或多个母顶点,则“ v”必须为一个(或其中之一)。通过从v执行DFS / BFS来检查v是否为母顶点。此步骤还需要O(V + E)时间。