Aby uprościć kierowaną strukturę wykresów, nie jest konieczne, aby węzły miały odsyłacze do swoich przodków. Chciałbym również umieścić klasę węzła wewnątrz twojej klasy DAG. Koncepcyjnie ta reprezentacja ma więcej sensu, ponieważ na grafie skierowanym, jeśli węzeł A łączy się z węzłem B, nie musi istnieć ścieżka od B do A. W rzeczywistości nie może istnieć ścieżka w obu kierunkach, ponieważ byłby to cykl.
public class DAG {
Node root; // assuming only one root exists
public static class Node{
List<Node> successors;
int value;
}
}
Aby znaleźć ścieżkę od korzenia do danego węzła, to trzeba uruchomić algorytm przeszukiwania grafu. Oznacza to możliwość odwiedzania innych węzłów na wykresie, prawdopodobnie rekurencyjnie, aż zlokalizujesz dany węzeł. Jeśli chcesz uniknąć powtarzania tego rodzaju obliczeń, można również zapisać ścieżkę z korzenia do danego węzła z mniej więcej tak:
class PathMap {
HashMap<DAG.Node, List<DAG.Node> > pathMap;
public List<DAG.Node> getPathFromRoot(DAG.Node n) {
List<DAG.Node> pathFromRoot = pathMap.get(n);
return pathFromRoot;
}
}
Teraz może być kilka różnych ścieżek od korzenia do A dany węzeł. W takim przypadku możesz zaimplementować shortest-path-first algorithm, aby znaleźć i zapisać optymalną ścieżkę. Zobacz ten kod: dzone article dla pseudokodowania.
Zobacz ten wątek http://stackoverflow.com/questions/144642/tree-directed-acyclic-graph-implementation –