Per semplificare la struttura del grafico orientato, non è necessario che i nodi abbiano collegamenti ai rispettivi antenati. Metterei anche la classe Node nella tua classe DAG. Concettualmente questa rappresentazione ha più senso in ogni caso poiché in un grafo orientato, se il nodo A si collega al nodo B, non c'è bisogno di un percorso da B ad A. Infatti non ci può essere un percorso in entrambe le direzioni perché quello sarebbe un ciclo.
public class DAG {
Node root; // assuming only one root exists
public static class Node{
List<Node> successors;
int value;
}
}
Per trovare il percorso dalla radice a un nodo particolare, è necessario eseguire un algoritmo per cercare nel grafico. Ciò significa che è possibile visitare gli altri nodi nel grafico, probabilmente in modo ricorsivo, finché non si individua il nodo specificato. Se si vuole evitare di ripetere questo tipo di calcoli, si potrebbe anche memorizzare il percorso dalla radice ad un dato nodo con qualcosa di simile:
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;
}
}
Ora ci possono essere più diversi percorsi dalla radice ad un dato nodo In tal caso, è possibile implementare un valore shortest-path-first algorithm per trovare e memorizzare il percorso ottimale. Vedi questo dzone article per pseudocodice.
Date un'occhiata a questa discussione http://stackoverflow.com/questions/144642/tree-directed-acyclic-graph-implementation –