我有一个依赖图,我表示为 Map<Node, Collection<Node>> (在 Java 中,或 f(Node n) -> Collection[Node] 作为函数;这是从给定节点 n 到依赖于 n 的节点集合的映射)。该图可能是循环的*。

给定一个节点列表 badlist ,我想解决一个 reachability problem :即生成一个 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 到达。)

*循环:如果你很好奇,那是因为它代表 C/C++ 类型,并且结构可以包含指向所讨论结构的指针的成员。

最佳答案

在 Python 中:

def reachable(graph, badlist):
    badmap = {}
    for root in badlist:
        stack = [root]
        visited = set()
        while stack:
            v = stack.pop()
            if v in visited: continue
            stack.extend(graph[v])
            visited.add(v)
        badmap[root] = visited
    return badmap

关于algorithm - 图算法 : reachability from adjacency map,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7276010/

10-12 17:43