Để đơn giản hóa cấu trúc biểu đồ được chỉ dẫn của bạn, không cần thiết cho các nút có liên kết quay lại tổ tiên của chúng. Tôi cũng sẽ đặt lớp Node bên trong lớp DAG của bạn. Về mặt khái niệm, biểu diễn này càng có ý nghĩa hơn vì trong một đồ thị có hướng, nếu nút A liên kết đến nút B, không cần phải có đường từ B đến A. Trên thực tế không thể có đường dẫn theo cả hai hướng vì đó sẽ là một chu kỳ.
public class DAG {
Node root; // assuming only one root exists
public static class Node{
List<Node> successors;
int value;
}
}
Để tìm đường dẫn từ gốc đến nút cụ thể, bạn cần chạy thuật toán để tìm kiếm qua biểu đồ. Điều đó có nghĩa là có thể truy cập các nút khác trong biểu đồ, có thể đệ quy, cho đến khi bạn xác định vị trí nút đã cho. Nếu bạn muốn tránh lặp lại những loại tính toán, bạn cũng có thể lưu trữ các đường đi từ gốc để một nút cho trước với một cái gì đó như thế này:
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;
}
}
Bây giờ có thể có những con đường khác nhau từ gốc đến một nút đã cho. Trong trường hợp đó, bạn có thể muốn triển khai shortest-path-first algorithm để tìm và lưu trữ đường dẫn tối ưu. Xem số dzone article cho mã giả này.
Hãy xem chủ đề này http://stackoverflow.com/questions/144642/tree-directed-acyclic-graph-implementation –