У меня есть граф зависимостей, который я представлял как Map<Node, Collection<Node>>
(на языке Java или f(Node n) -> Collection[Node]
как функция; это отображение из данного узла n
в набор узлов, которые зависят от n
). График потенциально циклический *.
Учитывая список badlist
узлов, я хотел бы решить проблему достижимости : т.е. сгенерировать Map<Node, Set<Node>> badmap
, который представляет отображение из каждого узла N в списке badlist
к набору узлов, который включает 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 ++, и структуры могут иметь члены, которые являются указателями на данную структуру.