algorithm - 有向图分解

标签 algorithm graph

我想将有向无环图分解为最少数量的组件,以便在每个组件中满足以下属性 - 对于组件中的所有顶点对 (u,v),存在从 u 到 v 从 v 到 u 的路径。

有什么算法吗?

我知道当条件中的 or 被替换为 and 时,它与查找强连通分量的数量相同(这可以使用 DFS)。

*编辑:*如果有向图包含循环(即它不是非循环的)会怎样?

最佳答案

我的想法是使用 DFS 以 O(n) 的拓扑方式对图进行排序,然后考虑对于哪些顶点此属性可以为假。对于从 2 个不同分支加入或拆分为 2 个不同分支的人来说,这可能是错误的。

我会从任何起始顶点(拓扑排序中最低的)开始并沿着它的路径进入随机分支,直到你不能走得更远并从图中删除这条路径(第一个组件)。这将重复直到图为空并且您拥有所有这些组件。

这似乎是一个贪心算法,但考虑到您在第一次运行时找到了一条非常短的路径(运气不好)或者您找到了一条最长的路径(运气好)。然后你仍然需要在算法的另一步中找到那个小分支组件。

复杂度为 O(n*组件数)。

当存在条件时,您应该考虑任何有向图,因为 DAG 不能具有强连通分量。

关于algorithm - 有向图分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33606608/

相关文章:

c - 我正在尝试使用 while 循环在 bst 中插入节点,但它不起作用

algorithm - 使用树结构,检查两个给定表达式是否相等

javascript - 如何在折线图中添加多种背景颜色

java - 计算数组位置的更小和更大的值

算法 : Find recursive equation of divide and conquer algorithm

javascript - 绝对div定位算法使用

java - 除了使用 swt 绘图之外,还有更好的选择吗?

algorithm - 有向图中的循环

python - 创建直方图

c - 当我在相邻列表中插入节点时,我无法在图表上获取值