2010-03-26 5 views

Trả lời

21

Dynamic programming. Nó cũng được tham chiếu trong Longest path problem, cho rằng đó là một DAG.

Các mã sau đây từ Wikipedia:

algorithm dag-longest-path is 
    input: 
     Directed acyclic graph G 
    output: 
     Length of the longest path 

    length_to = array with |V(G)| elements of type int with default value 0 

    for each vertex v in topOrder(G) do 
     for each edge (v, w) in E(G) do 
      if length_to[w] <= length_to[v] + weight(G,(v,w)) then 
       length_to[w] = length_to[v] + weight(G, (v,w)) 

    return max(length_to[v] for v in V(G)) 
+1

Việc này chỉ trả về độ dài của đường dẫn. Mã có thể dễ dàng sửa đổi để trả lại đường dẫn không? – oschrenk

+1

Có, cùng một cách với hầu hết các sự cố DP - hãy theo dõi trước đó và quay lại. – Larry

+2

'topOrder (G)' là danh sách các đỉnh của G trong [thứ tự topo] (https://en.wikipedia.org/wiki/Topological_sorting) –

4

Chừng nào đồ thị là mạch hở, tất cả các bạn cần làm là phủ nhận các trọng cạnh và chạy bất kỳ thuật toán ngắn nhất con đường.

EDIT: Rõ ràng, bạn cần một thuật toán đường dẫn ngắn nhất hỗ trợ trọng số âm. Ngoài ra, thuật toán từ Wikipedia dường như có độ phức tạp thời gian tốt hơn, nhưng tôi sẽ để lại câu trả lời của tôi ở đây để tham khảo.

+0

và chúng tôi có giữ cho trọng số âm là âm? : p – Hellnar

+0

@ Hellnar: không, nếu bạn có trọng số âm trong biểu đồ gốc, chúng sẽ trở nên tích cực. w '= - (w) –

1

có thể được giải quyết bằng phương pháp đường găng:
1. tìm một trật tự topo
2. tìm đường dẫn quan trọng
xem [Horowitz 1995], Nguyên tắc cơ bản về cấu trúc dữ liệu trong C++, Science Science Press, New York.

Chiến lược tham lam (ví dụ Dijkstra) sẽ không hoạt động, bất kể: 1. sử dụng "max" thay vì "min" 2. chuyển đổi trọng số dương thành âm 3. cho số M rất lớn và sử dụng M-w làm trọng số.