Я не знаю, как вы определяете узлы графа. Допустим, один из способов представления узла выглядит так:
public interface Node {
int getValue();
List<Node> getChildren();
}
Проблема с такой реализацией заключается в том, что мы не знаем родителя одного узла. Если у нас есть какой-то способ узнать, кто является родителем одного узла, мы можем выяснить зависимость от алмаза.
Например, в вашем случае, мы должны начать с нижней части дерева, и мы можем видеть, что у D есть два Parenets, и они приходят из B.
Поэтому я бы сказал, Постройте свой график, который заботится не только о детях, но и о родителях. Затем за один проход выясните, у каких узлов более одного родителя (как у D), и если у этих паренетов (C и E) один и тот же родитель (B).