用于确定DAG是否具有可从每个其他顶点到达的顶点的线性时间算法?

时间:2013-03-30 07:52:29

标签: algorithm graph language-agnostic graph-theory directed-acyclic-graphs

我有以下功课问题: DAG:设计线性时间算法(O(|E|+|V|))以确定DAG是否具有可从每个其他顶点到达的顶点,如果是,则找到一个。

现在我解决这个问题的方法如下: - >首先找到拓扑排序中最后出现的顶点(称之为V)。

- >现在,确定是否可以从此顶点V到达反向图的每个顶点。

- >如果每个顶点都是可到达的,则顶点V是所需的顶点,否则图中没有可从每个其他顶点到达的顶点。

这种做法是否正确?

PS。这个问题解决方案的提示说我应该计算每个顶点的outdegree。但我无法理解如何计算outdegree有帮助。

3 个答案:

答案 0 :(得分:3)

考虑弧(u, v) ∈ E。由于图表是非循环的,因此u无法访问v。因此u不能解决问题。由此可见,只有零度的顶点才能成为解决方案。

此外,必须有一个具有outdegree为零的顶点,或者问题没有解决方案。

我把剩下的作为练习留给读者。

答案 1 :(得分:1)

解决方案是计算所有顶点的出度,以查看是否有一个单一的汇聚顶点(出度为0的顶点),这就是证明。

声明:当且仅当存在一个单一顶点且出度为0时,DAG才能从其他每个顶点到达。

此声明可以通过两个步骤来证明。

必要性证明:如果DAG包含每个其他顶点均可到达的顶点u,则它必须是唯一的宿顶点(出度为0的顶点)

  • u的度数为0,否则为循环形式,与DAG相矛盾。
  • 不能再有一个度数为0的宿汇点v,否则u无法通过v到达。

证明。

充分性证明:如果DAG包含一个单一的汇聚顶点u,则应该可以从其他每个顶点到达u。

假定DAG中存在无法到达u的顶点。让我们将DAG中的所有顶点划分为可以到达u($ V_y $)且不能到达u($ V_n $)的顶点集合,然后$ V_n $中的顶点不存在任何指向顶点的边$ V_y $。

  

引理:任何DAG必须包含至少一个汇聚顶点。

这很容易通过矛盾证明。假设DAG中的每个顶点都具有非零的出度,因此从一个顶点开始,我们可以继续沿每个顶点的输出边缘遍历。由于DAG包含有限数量的顶点,因此我们最终将返回到先前访问的顶点,即检测到周期,这与DAG的定义相矛盾。

考虑由$ V_n $中的顶点及其之间的边形成的图,它也必须是DAG,否则原始图不能是DAG。假设v是此子DAG中的宿顶点,因此v在$ V_n $中没有指向顶点的出站边。

如上所述,v不能指向$ V_y $中的任何顶点,否则v可以到达u。

因此,原始DAG中v的整体外度也为0,这与DAG包含单个汇点顶点的假设相矛盾。证明。

答案 2 :(得分:0)

作为一个提示,考虑一下你可以将DAG划分为源节点(indegree 0),中间节点和sink节点(outdegree 0) - 使用通常的定义。

如果DAG确实包含这样一个节点(可以从其他每个顶点到达),它会是什么类型的节点?

绘制一个图形示例,其中两个节点的outdegree为0,每个顶点都有一个顶点。