algorithm - 给定 "roots"从无向无环图创建有向无环图

标签 algorithm directed-acyclic-graphs directed-graph

考虑以下无向无环图:

undirected

如果我们将“根”定义为 A 和 E,是否有一种算法可以确定生成的有向无环图?:

directed

我考虑过从根开始尝试某种 DFS 或 BFS,但我不太确定如何处理“等待”看看另一个根是否可能到达给定节点的需要。

最佳答案

我假设您正在寻找的是边缘的方向,使得

  • 整体图是一个 DAG,并且
  • DAG 的源节点是您指定的节点。

现在,我们忽略第二个约束。使整个图成为 DAG 的一个简单方法是将顺序 1 ... n 分配给节点,然后让边始终从较低节点指向较高节点。因此,问题是如何以提供第二个属性的方式分配数字。

我相信您可以通过在图表上运行 BFS 并使用所有 k 个根节点为队列播种来实现此目的。如果按照发现的顺序对节点进行编号,那么您将获得一个 DAG(节点的任何顺序都会给出一个 DAG)。此外,假设没有两个根彼此相邻,并且图的每个连通分量中至少有一个根,那么您的根将是唯一的根。

要看到这一点,假设没有一个根是相邻的并且图是连接的,然后为了矛盾起见假设其他节点是根。取除了您选择的也是根的节点之一之外编号最小的节点。因为节点被分配了一个编号,所以它一定是在 BFS 中发现的,因此它与也在 BFS 中发现的其他一些编号较低的节点相邻。但是,来自较低编号节点的边将有一个箭头指向较高编号的节点,因此它不会是根。

(如果您有两个相邻节点想要成为根,则无法实现此目的,因为一个节点将有一个箭头指向另一个节点。)

总的来说,它的运行时间为 O(m + n),因为它只是图上的 BFS。

关于algorithm - 给定 "roots"从无向无环图创建有向无环图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61306032/

相关文章:

c# - 如何按总和的升序遍历所有大小为 K 的子集合。

c++ - 低内存最短路径算法

algorithm - 是否有任何算法可以找到 DAG 中的所有关键路径?

algorithm - 如何计算循环图的密度?

c++ - 循环问题中的 'lower bound'是什么意思?

python - 在网络中有效识别给定距离内的祖先/后代

c - 查找数组中元素的最大总和的算法,使得不超过 k 个元素相邻

c++ - 什么算法用于查找无序数组的第 n 个排序子数组?

algorithm - 是否有可能在比 (n 选择 3) 更好的时间内找到可以从长度列表中形成的三角形数量?

java - 实现具有多个 parent 和 child 的图表