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