algorithm - 从给定“根”的无向无环图创建有向无环图
问题描述
考虑以下无向无环图:
如果我们将“根”定义为 A 和 E,是否有一种算法可以确定生成的有向无环图?:
我考虑从根开始尝试某种 DFS 或 BFS,但我不确定如何处理“等待”以查看另一个根是否可能到达给定节点的需要。
解决方案
我假设你正在寻找的是边缘的方向,这样
- 整个图是一个 DAG,并且
- DAG 的源节点是您指定的那些。
现在,让我们忽略第二个约束。使整个图成为 DAG 的一种简单方法是将排序 1 ... n 分配给节点,然后让边始终从较低节点指向较高节点。因此,问题将是如何以一种为您提供第二个属性的方式分配数字。
我相信你可以通过在图上运行 BFS 来做到这一点,用你的所有 k 个根节点为队列播种。如果按照发现的顺序对节点进行编号,那么您将得到一个 DAG(节点的任何顺序都会给出一个 DAG)。此外,假设没有两个根彼此相邻,并且图的每个连接组件中至少有一个根,那么您的根将是唯一的根。
要看到这一点,假设你的根都不相邻并且图是连接的,然后为了矛盾起见假设其他节点是根。取除您选择的也是根的节点之一之外的编号最小的节点。因为该节点被分配了一个编号,所以它一定是在 BFS 中发现的,因此它与在 BFS 中也发现的其他一些编号较低的节点相邻。但是从编号较低的节点开始的边将有一个指向编号较高的节点的箭头,因此它不会是根。
(如果您有两个相邻的节点想要成为根,则无法进行此操作,因为一个箭头会指向另一个。)
总的来说,这在 O(m + n) 时间内运行,因为它只是图上的 BFS。
推荐阅读
- android - Soloud + OpenSLES 后端,非活动音轨
- angular - 为什么每次注入服务后都要调用构造函数?
- azure - Azure 网站加载需要很长时间
- tomcat - dspace 中的 Tomcat 错误
- c - 为什么 IoGetInitialStack 函数仅限于 IRQL<=APC_LEVEL?
- mvvm - 使用 ViewModel、Xamarin.Forms 中的绑定在 StackLayout 中添加子项
- jquery - 来自两个不同ajax方法的两个不同列如何组合成单行
- c# - 如何在 Visual Studio 中参数化负载测试?
- ruby - ruby 中的“for”循环求和
- python - Keras 后端自定义损失函数