【发布时间】:2010-11-09 19:12:24
【问题描述】:
假设DAG 中有一个顶点具有以下属性:
所有顶点都连接到它
它不连接到任何顶点
这通常称为汇顶点。
是否可以在O(n) 中检测到这个顶点,其中n 是图中的顶点数?
【问题讨论】:
-
对于某些顶点 A 和 B,图是否可以有多个边 A -> B?
-
不,一对顶点只有一条边
标签: algorithm graph sink-vertex
假设DAG 中有一个顶点具有以下属性:
所有顶点都连接到它
它不连接到任何顶点
这通常称为汇顶点。
是否可以在O(n) 中检测到这个顶点,其中n 是图中的顶点数?
【问题讨论】:
标签: algorithm graph sink-vertex
由于图中没有环,所有顶点都与sink相连,因此只需选择任意一个起始节点并开始随机行走。当你无法继续行走时,你就在水槽边,最多走 n 步。
一旦您走了 n 步(或更少且您无法继续),由于问题并不能保证有水槽,您应该检查您是否在其中。这又增加了一个O(n)。所以问题是O(2 n) = O(n)
【讨论】:
如果m 是O(n),我能想到的最好的就是O(n + m) 即O(n)。
假设存在汇,对图进行拓扑排序。排序中的最小节点是一个接收器。注意拓扑排序是O(n + m)。
我之前提供了一个实现here,可以很容易地针对这个问题进行修改。
【讨论】:
如果您可以在线性时间内计算出节点的边数,这是可能的。首先,找到没有出边的顶点(O(n)扫描所有节点)。只有当恰好有一个这样的顶点时,您的条件才会满足。然后,计算它的输入边(O(n) 扫描所有输入边)。如果恰好有 n-1 个传入边,则满足您的条件。如果任一测试失败,则没有汇顶点。
我假设“连接”是指“通过边缘连接”,而不是“通过路径可达”。
【讨论】:
a 是星节点,b->a, c->a, b->c 是DAG,从b 到a 有两条路径没问题