【问题标题】:Find an O(n) algorithm that returns all interesting vertices of the graph找到一个 O(n) 算法,它返回图的所有感兴趣的顶点
【发布时间】:2020-01-03 02:05:35
【问题描述】:

问题:提供了一个有 n 个顶点和一个特殊顶点 u 的有向图 G。如果存在从 v 到顶点 w 的路径使得存在包含顶点 w 和 u 的循环,我们称顶点 v 为“有趣”。编写一个 O(n) 时间算法,以 G(整个图)和节点 u 作为输入并返回所有感兴趣的顶点。

低效率的算法: 我最初的想法是考虑节点 u 并计算包含 u 的所有循环。 (这本身似乎使用 DFS 遍历节点,然后在遇到访问节点时也进行前向跟踪)现在从这些循环上的每个顶点,我们可以计算图上不属于循环的节点数( s) 但在一个循环上与每个不等于 u 的特定顶点 w 相连。添加所有这些值以获得所需的答案。这不是 O(n) 算法。

【问题讨论】:

  • G 是如何表示的? (如果它被表示为一个邻接列表,那么这显然是不可能的,因为可能有超过 O(n) 条边,所以仅仅 读取 邻接列表可能会花费超过 O(n) 的时间。我怀疑 Gany 表示也会有类似的情况,但具体的描述将有助于证实这一点。)
  • @ruakh 我不太确定。我已经复制了这个问题,没有任何修改。我们不要假设它被列为邻接列表。
  • 能否请您澄清一下“有一条从v到顶点w的路径,因此存在一个包含顶点w和u的循环”部分?所以有一条从 v 到 w 的路径。它与包含 w 和 u 的循环有什么关系?循环应该是路径的一部分吗?
  • @NicoSchertler 因此,当 v 和另一个顶点 w 以 w 和 u 是图中某个现有循环的两个节点的方式连接时,顶点 v 很有趣。
  • @NicoSchertler:我同意它的措辞非常混乱,但我认为这是有道理的:如果存在顶点 w,则 v 是“有趣的” > 使得有一条从vw 的路径,以及一个包含wu 的循环。跨度>

标签: algorithm graph


【解决方案1】:

有两种情况:

  • 如果没有包含 u 的环,则没有顶点可以是“有趣的”。
  • 如果存在任何包含 u 的环,则当且仅当存在从 v。 (我们不必担心问题描述中的w,因为如果一个循环包含两个顶点uw,那么任何以 u 结束的路径可以扩展为以 w 结束,反之亦然。)

因此,最有效的算法如下:

  1. 使用 DFS,确定 u 是否处于循环中。 (我们不需要找到所有个循环;我们只需要确定是否有个循环。)
  2. 在“反向”方向上使用 DFS,找到 u 可到达的所有顶点。

DFS 需要 O(|V| + |E|) 时间,大于 O (n) = O(|V|) 除非 |E|在O(n);但是,没有办法在不到 |E| 的时间内读入整个图形定义。时间,所以这是不可避免的。给你这个问题的人一定没有真正想过这个问题。

【讨论】:

    猜你喜欢
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    相关资源
    最近更新 更多