![](/img/trans.png)
[英]Get preprocessors and successors of a directed acyclic graph in precedence feasible ordering
[英]Check if directed acyclic graph is feasible
对于给定的有向无环图G我正在寻找一种方法来验证包含活动的列表L是否优先可行。 节省资源的解决方案会很好,因为G的大小可能会急剧增加。
例子:
G = {0: [], 1: [0], 2: [0], 3: [0], 4: [1], 5: [1], 6: [4], 7: [4], 8: [3,6,7], 9: [2,5,6], 10: [2,5], 11: [8,9,10]}
现在这份清单
L1 = [0, 1, 2, 3, 4, 5, 10, 6, 7, 9, 8, 11]
例如是可行的,但
L2 = [1, 0, 2, 3, 4, 10, 5, 6, 7, 9, 8, 11]
不是因为活动 0 是 1 的前身,而活动 5 是 10 的前身。
据我了解,您要检查给定的节点顺序是否与图中边缘定义的部分顺序一致。 也许我遗漏了一些东西,但为此它应该足以检查所有边a ---> b
列表中a
的索引低于b
的索引。 如果您首先创建一个字典将元素映射到它们的位置,则复杂度将仅为O(e)
, e
是边数。
def check(g, l):
pos = {x: i for i, x in enumerate(l)} # for O(1) index
return all(pos[a] < pos[b] for b in g for a in g[b])
G = {0: [], 1: [0], 2: [0], 3: [0], 4: [1], 5: [1], 6: [4],
7: [4], 8: [3,6,7], 9: [2,5,6], 10: [2,5], 11: [8,9,10]}
L1 = [0, 1, 2, 3, 4, 5, 10, 6, 7, 9, 8, 11]
L2 = [1, 0, 2, 3, 4, 10, 5, 6, 7, 9, 8, 11]
print(check(G, L1)) # True
print(check(G, L2)) # False
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.