Tìm đường đi ngắn nhất và dài nhất giữa hai đỉnh trong DAG


14

Cho một DAG không trọng số (đồ thị chu kỳ có hướng) và hai đỉnh và , có thể tìm đường đi ngắn nhất và dài nhất từ đến trong thời gian đa thức không? Độ dài đường dẫn được đo bằng số cạnh.s t s tD= =(V,Một)StSt

Tôi quan tâm đến việc tìm phạm vi độ dài đường dẫn có thể có trong thời gian đa thức.

Ps., Câu hỏi này là một bản sao của câu hỏi StackOverflow Đường dẫn dài nhất trong DAG .

Câu trả lời:


10

Đối với vấn đề đường đi ngắn nhất, nếu chúng ta không quan tâm đến trọng lượng, thì tìm kiếm đầu tiên theo chiều rộng là một cách chắc chắn. Nếu thuật toán Dijkstra làm việc miễn là không có cạnh tiêu cực.

Đối với con đường dài nhất, bạn luôn có thể thực hiện Bellman-Ford trên biểu đồ với tất cả các trọng số cạnh bị phủ định. Hãy nhớ lại rằng Bellman-Ford hoạt động miễn là không có chu kỳ trọng lượng âm, và do đó hoạt động với bất kỳ trọng lượng nào trên DAG.


2
Bellman-Ford một thuật toán lập trình động.
Raphael

1
@Raphael có, nhưng tôi nghĩ rằng có một thuật toán DP trực tiếp để tìm đường dẫn tối đa, thay vì phủ định tất cả các trọng số cạnh.
jmite

1
@jmite: Tại sao, tất nhiên: chỉ cần thay đổi Bellman-Ford để thực hiện chuyển đổi trực tuyến hoặc tối đa hóa, hoặc ...
Raphael

1
Nhân tiện, tôi không tin một cách trực giác rằng vấn đề NP-đầy đủ Đường dẫn dài nhất vì thế dễ dàng trong P trên DAG. Tôi đánh giá cao một bằng chứng / tài liệu tham khảo / giải thích.
Raphael

2
Ngoài ra, còn có một thuật toán DP đơn giản và hiệu quả hơn cho DAG

8

Đặt m = | E ( G ) | . Gọi w ( a b ) biểu thị trọng lượng của cạnh ( a b ) . Giả sử rằng bạn muốn tìm chi phí đường dẫn tối thiểu và tối đa từ s đến t .n= =|V(G)|m= =|E(G)|w(mộtb)(mộtb)St

Bắt đầu từ , thực hiện như sau:b: =t

  1. Nếu đã được truy cập, trả về min ( b )max ( b ) đã tính . Nếu không thì đánh dấu b là đã truy cập.btối thiểu(b)tối đa(b)b

  2. Xác định và ghi lại max ( b ) như sau.tối thiểu(b)tối đa(b)

    • Nếu , lưu trữ min ( s ) : = max ( s ) : = 0 .b= =Stối thiểu(S): =tối đa(S): =0
    • Khác đặt bỏ qua các đỉnh màmin(a)=max(a)=inaccessible. Khi tính toán tối thiểu và tối đa trên một tập hợp các cạnh trống (không có cạnh nào trongb hoặc bbị bỏ qua), hãy đặtmin(b)
      tối thiểu(b): =tối thiểumộtb[w(mộtb)+tối thiểu(một)]tối đa(b): =tối đamộtb[w(mộtb)+tối đa(một)]
      tối thiểu(một)= =tối đa(một)= =TôinmộtcceSSTôibtôieb .tối thiểu(b): =tối đa(b): =TôinmộtcceSSTôibtôie

Bạn sẽ có thể chứng minh rằng thuật toán này chạy trong thời gian , bỏ qua thời gian cần thiết để khởi tạo tất cả các biến đỉnh.Ôi(m)


Cách tiếp cận này kéo đệ quy có thể thực sự chậm hơn so với cách tiếp cận động lực đẩy thông thường, và nó cần một chồng kích thước tuyến tính để xử lý đệ quy. Cách tiếp cận thông thường là lấy các đỉnh theo thứ tự tôpô và cải thiện mức tối thiểu và tối đa tạm thời cho mỗi lân cận của nút hiện tại. Nút hiện tại luôn có giá trị cuối cùng là tối thiểu và tối đa vì tất cả các cạnh trong phải đã được sử dụng để cải thiện chúng.
Palec
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.