algorithm - 设计一个时间复杂度为 O(|V | + |E|) 的算法,用于查找有向图的根顶点(或报告根顶点不存在)

标签 algorithm graph graph-algorithm

<分区>

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

最佳答案

这是 O(|V| + |E|) 方法:

  1. 首先,我们可以将属于同一SCC(强连通分量)的所有节点连接到 super 节点,并基于此构建新图,我们称之为 SCC-graph(也称为凝聚图)图,可以用Kosaraju算法在O(|V| + |E|))中完成
  2. 因为根据定义 SCC 图不能有环,所以它是 DAG
  3. 对于 SCC 图中的每个节点,我们可以计算它的入度(指向它的边数)
  4. 现在如果 SCC 图中有超过 1 个入度为 0 的节点,则没有根
  5. 如果 SCC 图中只有一个入度为 0 的节点,那么原始图中属于入度为 0 的 SCC 图节点的任何节点都可以是根

关于algorithm - 设计一个时间复杂度为 O(|V | + |E|) 的算法,用于查找有向图的根顶点(或报告根顶点不存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55118027/

相关文章:

matlab - 如何绘制矩阵中非零元素的坐标?

algorithm - 我们如何找到带有两个不同 "ID"的图的最大连续区域?

c++ - 双数据类型背包

algorithm - 生成不相交的位指针对列表

javascript - 通过 JSON 文件创建大型客户端 Javascript 对象数组的替代方案?

c++ - 如果树的根改变了怎么办?

c# - 如何连接点和吸收动量?

algorithm - 不规则形状内的点

python - 实现最小化方法

java - 如何在 Marklogic 中同时查询不同类型文档的图表?