从给定 "roots" 的无向无环图创建有向无环图
Create Directed Acyclic Graph from Undirected Acyclic Graph given "roots"
考虑以下无向无环图:
如果我们定义"roots"为A和E,有没有算法可以确定得到的有向无环图?:
我考虑过从根开始尝试某种 DFS 或 BFS,但我不确定如何处理 "wait" 以查看另一个根是否可以到达给定节点的需要。
我假设您正在寻找的是这样的边缘方向
- 整体图为DAG,并且
- DAG 的源节点就是您指定的节点。
现在,让我们忽略第二个约束。使整个图成为 DAG 的一种简单方法是将顺序 1 ... n 分配给节点,然后让边缘始终从较低节点指向较高节点。所以问题就是如何以给你第二个的方式分配数字 属性.
我相信您可以通过 运行 在图上进行 BFS 来做到这一点,将所有 k 个根节点播种到队列中。如果您按照节点被发现的顺序对节点进行编号,那么您将得到一个 DAG(节点的任何排序都会给出一个 DAG)。此外,假设没有两个根彼此相邻并且图中的每个连通分量中至少有一个根,那么您的根将是唯一的根。
要看到这一点,假设 none 个根是相邻的并且图形是连接的,然后为了矛盾而假设其他节点是根。取除您选择的节点之一之外的编号最小的节点,该节点也是根。因为该节点被分配了一个编号,所以它一定是在 BFS 中被发现的,所以它与也在 BFS 中找到的其他编号较小的节点相邻。但是从低编号节点开始的边会有一个指向高编号节点的箭头,所以它不会是根。
(如果你有两个相邻的节点想成为根,就没有办法做到这一点,因为其中一个会有一个箭头指向另一个。)
总的来说,它的运行时间为 O(m + n),因为它只是图形上的 BFS。
考虑以下无向无环图:
如果我们定义"roots"为A和E,有没有算法可以确定得到的有向无环图?:
我考虑过从根开始尝试某种 DFS 或 BFS,但我不确定如何处理 "wait" 以查看另一个根是否可以到达给定节点的需要。
我假设您正在寻找的是这样的边缘方向
- 整体图为DAG,并且
- DAG 的源节点就是您指定的节点。
现在,让我们忽略第二个约束。使整个图成为 DAG 的一种简单方法是将顺序 1 ... n 分配给节点,然后让边缘始终从较低节点指向较高节点。所以问题就是如何以给你第二个的方式分配数字 属性.
我相信您可以通过 运行 在图上进行 BFS 来做到这一点,将所有 k 个根节点播种到队列中。如果您按照节点被发现的顺序对节点进行编号,那么您将得到一个 DAG(节点的任何排序都会给出一个 DAG)。此外,假设没有两个根彼此相邻并且图中的每个连通分量中至少有一个根,那么您的根将是唯一的根。
要看到这一点,假设 none 个根是相邻的并且图形是连接的,然后为了矛盾而假设其他节点是根。取除您选择的节点之一之外的编号最小的节点,该节点也是根。因为该节点被分配了一个编号,所以它一定是在 BFS 中被发现的,所以它与也在 BFS 中找到的其他编号较小的节点相邻。但是从低编号节点开始的边会有一个指向高编号节点的箭头,所以它不会是根。
(如果你有两个相邻的节点想成为根,就没有办法做到这一点,因为其中一个会有一个箭头指向另一个。)
总的来说,它的运行时间为 O(m + n),因为它只是图形上的 BFS。