У меня есть граф зависимостей, который я представил как 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 из определенного узла. Б.)
*циклический: если вам интересно, это потому, что он представляет типы C/C++, а структуры могут иметь члены, которые являются указателями на рассматриваемую структуру.