Tìm con đường dài nhất từ ​​gốc đến lá trong cây


15

Tôi có một cây (theo nghĩa lý thuyết đồ thị), chẳng hạn như ví dụ sau:

nhập mô tả hình ảnh ở đây

Đây là một cây được định hướng với một nút bắt đầu (gốc) và nhiều nút kết thúc (các lá). Mỗi cạnh có một chiều dài được gán cho nó.

Câu hỏi của tôi là, làm thế nào để tìm ra con đường dài nhất bắt đầu từ gốc và kết thúc ở bất kỳ lá nào? Cách tiếp cận brute-force là kiểm tra tất cả các đường dẫn gốc và lấy đường dẫn có độ dài tối đa, nhưng tôi thích thuật toán hiệu quả hơn nếu có.


Câu trả lời:


16

Ran G. đã đưa ra gợi ý về một thuật toán hiệu quả, mặc dù có lẽ ông đã bỏ qua một số chi tiết. Việc tính toán tất cả các đường dẫn gốc thực sự hơi kém hiệu quả nếu bạn làm đi làm lại nhiều lần, ví dụ, nếu bạn tính toán từng đường dẫn và sau đó tính toán độ dài.

Thực hiện thuật toán đệ quy sau bắt đầu bằng LongestPath(root)sẽ cho những gì bạn muốn. Về cơ bản, nó tính toán đệ quy con đường dài nhất cho mỗi cây con. Tại mỗi nút, điều này đòi hỏi phải xây dựng các đường dẫn mới và trả về đường dẫn dài nhất.

 LongestPath(node)
   If node is a leaf, return (node,0) 
   If node is not a leaf:  
    For each edge (node,length,next):
       Let (p,l) = LongestPath(next)
       Let (path,len) = (p++[next], l + length)
    Return element (path,len) from previous step with largest value len

Đây là sự kết hợp nếu mã giả với một số ký hiệu Haskell, vì vậy tôi hy vọng nó có thể hiểu được.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.