我有一个依赖图,它被表示为一个 Map<Node, Collection<Node>>
(在Java中,或者作为一个函数f(Node n) -> Collection[Node]
;这是从给定节点n
到依赖于n
的节点集合的映射)。该图可能存在循环依赖*。
给定一个节点列表badlist
,我想解决可达性问题:即生成一个 Map<Node, Set<Node>> badmap
,表示从列表badlist
中的每个节点N到包括N或其他直接或间接依赖于它的节点的集合的映射。
例如:
(x -> y means node y depends on node x)
n1 -> n2
n2 -> n3
n3 -> n1
n3 -> n5
n4 -> n2
n4 -> n5
n6 -> n1
n7 -> n1
这可以表示为邻接映射
{n1: [n2], n2: [n3], n3: [n1, n5], n4: [n2, n5], n6: [n1], n7: [n1]}
。如果
badlist = [n4, n5, n1]
,则期望得到badmap = {n4: [n4, n2, n3, n1, n5], n5: [n5], n1: [n1, n2, n3, n5]}
。我在网上寻找图形算法参考资料时感到困惑,因此如果有人能指向一个高效的可达性算法描述,我将不胜感激。(不帮助我的一个例子是http://www.cs.fit.edu/~wds/classes/cse5081/reach/reach.html,因为该算法是确定特定节点A是否从特定节点B可达。)
*cyclic: 如果你好奇,这是因为它代表了C/C++类型,而结构体可以有成员是指向问题结构体的指针。
for root in badlist
循环。所以也许有可能为速度进行优化…但是你现在所拥有的已经足够简单了。 - Jason S