Cách tìm đường đi ngắn nhất từ ​​một số đỉnh trong tập hợp


7

Nếu tôi có một biểu đồ G=(V,E), một tập hợp con của đỉnh SV và một đỉnh thứ hai S(VS), cách tốt nhất để tìm con đường ngắn nhất kết nối hai bộ là gì? Đó là, chúng tôi đang tìm kiếm một con đường ngắn nhất trong số tất cảS-Sđường dẫn. Chúng tôi cũng có thể giả định tất cả các trọng số cạnh là tích cực.

Đây là cách tôi đã tiếp cận vấn đề này cho đến nay:

Tôi đã có thông tin ma trận khoảng cách (d) cho đồ thị Gđược tính toán bằng cách áp dụng thuật toán Floyd-Warshall trong một hoạt động trước đó.

Sau đó tôi lặp đi lặp lại trên tất cả các đỉnh trong S cho mỗi đỉnh trong S và tìm cặp (s1,s2) với giá trị nhỏ nhất trong ma trận d.

Thuật toán của Dijkstra sau đó được sử dụng để tính toán con đường ngắn nhất giữa s1s2, do đó, kết nối bộ đỉnh SS.

Có cách nào hiệu quả hơn để đạt được kết quả tương tự này không?

Câu trả lời:


6

Nếu tất cả các độ dài cạnh là không âm, thì điều này có thể được giải quyết trong O(|E|lg|V|) thời gian sử dụng một lời gọi duy nhất của thuật toán Dijkstra.

Chúng tôi sẽ sửa đổi biểu đồ một chút bằng cách thêm một đỉnh mới s. Ngoài ra, thêm một cạnh có độ dài 0 từs đến từng đỉnh trong S.

Tiếp theo, chạy thuật toán của Dijkstra, bắt đầu từ đỉnh nguồn s. Thuật toán của Dijkstra sẽ tính toán cho bạn khoảng cách từs đến mọi đỉnh khác v, tức là nó sẽ tính toán d(s,v) cho tất cả vV. Lưu ý rằngd(s,v) sẽ chính xác là chiều dài của con đường ngắn nhất từ ​​một số đỉnh trong S đến đỉnh v.

Cuối cùng, tính toán min{d(s,v):vS}. Đây sẽ là chiều dài của con đường ngắn nhất từ ​​một số đỉnh trong đến một số đỉnh trong . Đó là câu trả lời của bạn.SS

Không cần phải chạy Floyd-Warshall.

Nếu bạn có thể có các cạnh âm, thì nó có thể được thực hiện trong thời gian . Chỉ cần thay thế thuật toán của Dijkstra bằng thuật toán Bellman-Ford.O(|V||E|)


1
Bạn thậm chí có thể lưu tính toán mức tối thiểu bằng cách thêm một đỉnh mới khác cho . (Bạn nên lưu ý rằng thời gian chạy bị ràng buộc giả định , điều này là hợp lý; có thể được giả định là được kết nối ở đây.)S|E|Ω(|V|)G
Raphael

cảm ơn câu trả lời của bạn, điều đó rất có ý nghĩa Liên quan đến quan điểm của bạn về việc không cần chạy Floyd-Warshall, nếu tôi đã chạy floyd-warshall cho một thứ khác và đã có sẵn thông tin đó, liệu có thể tìm kiếm trên biểu đồ khoảng cách nhanh hơn không? hay không? bởi vì dù sao chúng ta cũng phải chạy dijkstra, nên sử dụng phương pháp đỉnh giả nhanh hơn?
guskenny83

1
@ guskenny83, nó phụ thuộc. Nếu bạn đã chạy Floyd-Warshall, việc tìm đường đi ngắn nhất bằng đầu ra của nó sẽ mất thời gian để tìm kiếm tất cả các mục trong ma trận cho . Điều đó có thể chậm hơn hoặc nhanh hơn so với việc chạy thuật toán của Dijkstra, tùy thuộc vào kích thước của các bộ và biểu đồ. Đối với các biểu đồ thưa thớt và các tập lớn , nó sẽ chậm hơn trong trường hợp xấu nhất. Ôi(|S||S'|)d[bạn,v]bạnS,vS'S,S'S,S'
DW
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.