设计一个O(| V | + | E |)时间算法,该算法可找到有向图的根顶点(或报告不存在)

时间:2019-03-12 09:27:21

标签: algorithm graph graph-algorithm

给出有向图G =(V,E)。 G中的根顶点是这样的顶点v G中的任何其他顶点u都可以通过有向路径从v到达。如何设计O(| V | + | E |)时间算法来查找根顶点(或报告不存在根顶点)。

1 个答案:

答案 0 :(得分:0)

这里的O(| V | + | E |)方法:

  1. 首先,我们可以将属于同一 SCC (强连接组件)的所有节点连接到超级节点,并基于此建立新图,我们称其为SCC图(也称为缩合图)图,可以用O(| V | + | E |))中的Kosaraju算法完成
  2. 因为SCC图根据定义不能具有循环,所以它是DAG
  3. 对于SCC图中的每个节点,我们都可以计算其向内度(指向它的边数)
  4. 现在,如果SCC图中的节点数大于1,且度数为0,则没有根节点
  5. 如果SCC图中只有一个节点的in-degree为0,那么原始图中属于SCC-graph节点的一部分(其in-degree为0)的任何节点都可以是根节点