有向グラフの構造を単純化するために、ノードが祖先に戻るリンクを持つ必要はありません。また、Node クラスを DAG クラス内に配置します。有向グラフでは、ノード A がノード B にリンクしている場合、B から A へのパスが存在する必要がないため、概念的にはこの表現の方が理にかなっています。
public class DAG {
Node root; // assuming only one root exists
public static class Node{
List<Node> successors;
int value;
}
}
ルートから特定のノードへのパスを見つけるには、アルゴリズムを実行してグラフを検索する必要があります。これは、特定のノードが見つかるまで、おそらく再帰的に、グラフ内の他のノードにアクセスできることを意味します。この種の計算を繰り返さないようにしたい場合は、ルートから特定のノードへのパスを次のように保存することもできます。
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;
}
}
現在、ルートから特定のノードへの複数の異なるパスが存在する場合があります。その場合、最短パス優先アルゴリズムを実装して、最適なパスを見つけて保存することをお勧めします。疑似コードについては、このdzone の記事を参照してください。