我有以下功课问题:
DAG:设计线性时间算法(O(|E|+|V|)
)以确定DAG是否具有可从每个其他顶点到达的顶点,如果是,则找到一个。
现在我解决这个问题的方法如下: - >首先找到拓扑排序中最后出现的顶点(称之为V)。
- >现在,确定是否可以从此顶点V到达反向图的每个顶点。
- >如果每个顶点都是可到达的,则顶点V是所需的顶点,否则图中没有可从每个其他顶点到达的顶点。
这种做法是否正确?
PS。这个问题解决方案的提示说我应该计算每个顶点的outdegree。但我无法理解如何计算outdegree有帮助。
答案 0 :(得分:3)
考虑弧(u, v) ∈ E
。由于图表是非循环的,因此u
无法访问v
。因此u
不能解决问题。由此可见,只有零度的顶点才能成为解决方案。
此外,必须有一个具有outdegree为零的顶点,或者问题没有解决方案。
我把剩下的作为练习留给读者。
答案 1 :(得分:1)
解决方案是计算所有顶点的出度,以查看是否有一个单一的汇聚顶点(出度为0的顶点),这就是证明。
此声明可以通过两个步骤来证明。
证明。
假定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,每个顶点都有一个顶点。