为了简化您的有向图结构,节点不必有返回其祖先的链接。我还将 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 文章。