【问题标题】:Detecting the sink in a directed acyclic graph在有向无环图中检测汇
【发布时间】:2010-11-09 19:12:24
【问题描述】:

假设DAG 中有一个顶点具有以下属性:

  1. 所有顶点都连接到它

  2. 连接到任何顶点

这通常称为汇顶点

是否可以在O(n) 中检测到这个顶点,其中n 是图中的顶点数?

【问题讨论】:

  • 对于某些顶点 A 和 B,图是否可以有多个边 A -> B?
  • 不,一对顶点只有一条边

标签: algorithm graph sink-vertex


【解决方案1】:

由于图中没有环,所有顶点都与sink相连,因此只需选择任意一个起始节点并开始随机行走。当你无法继续行走时,你就在水槽边,最多走 n 步。

一旦您走了 n 步(或更少且您无法继续),由于问题并不能保证有水槽,您应该检查您是否在其中。这又增加了一个O(n)。所以问题是O(2 n) = O(n)

【讨论】:

  • 正如 Jason 所说,它的 O(n+m) 不是 n。
  • 不保证存在唯一的接收器——DAG 可能已断开连接。此方法不会告诉您是否所有顶点都连接到您找到的节点。
  • 如果断开连接,那么所有顶点都不能连接到它,可以吗?
  • 连接到接收器的每个顶点。如果图的边较少,这将更快地到达接收器。您不能停在任何不是水槽的顶点,因为根据定义,该顶点已连接到水槽。
  • @SaeedAlg 我需要遍历最多 n 条边,在我访问的每个顶点处选择任何(第一条)边。如果您假设选择顶点上的第一条边是无成本的,那么它是 O(n)
【解决方案2】:

如果mO(n),我能想到的最好的就是O(n + m)O(n)

假设存在汇,对图进行拓扑排序。排序中的最小节点是一个接收器。注意拓扑排序是O(n + m)

我之前提供了一个实现here,可以很容易地针对这个问题进行修改。

【讨论】:

  • 如果图表示是邻接表,则这种情况下的拓扑排序是 O(n+m)。
  • 您可以更新您的答案:检查它是否是接收器(此图中可能没有接收器),反转邻接列表而不是 DFS 并计算达到的节点数。
  • 您首先需要知道以及如何做(实施)“查找拓扑排序算法”
【解决方案3】:

如果您可以在线性时间内计算出节点的边数,这是可能的。首先,找到没有出边的顶点(O(n)扫描所有节点)。只有当恰好有一个这样的顶点时,您的条件才会满足。然后,计算它的输入边(O(n) 扫描所有输入边)。如果恰好有 n-1 个传入边,则满足您的条件。如果任一测试失败,则没有汇顶点。

我假设“连接”是指“通过边缘连接”,而不是“通过路径可达”。

【讨论】:

  • 不好:它是一个 DAG,这个节点可能没有 n-1 个输入。想想 A->B->C。 C 是一个水槽。
  • @Loïc 我认为“所有顶点都连接到它”比“有一条从任何顶点到它的路径”更强大的属性,我认为这是你的看法
  • 如果“全部连接”,那么拥有 DAG 有什么好处?这里的连接意味着路径。
  • @Loïc Février,认为a 是星节点,b->a, c->a, b->c 是DAG,从ba 有两条路径没问题
  • @Loïc 你可能是对的,Bronzebeard 关心路径而不是边缘。
猜你喜欢
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2012-02-14
相关资源
最近更新 更多