Kiểm tra xem chỉ có một đường dẫn đơn giản trong biểu đồ giữa các nút x và y`


7

Hãy nói rằng chúng tôi đã đưa ra đơn giản vô hướng đồ thị có nút và cạnh hai chiều. Đối với và chúng tôi muốn kiểm tra xem trong biểu đồ chỉ có một đường dẫn đơn giản giữa chúng.GNMxy

Những gì tôi đã nghĩ, là chúng ta nên tìm tất cả các chu kỳ trong biểu đồ và chạy bfs từ đến , nếu đường dẫn không di chuyển qua các đỉnh trong một chu kỳ nào đó, chỉ có một đường dẫn, và nếu không thì có nhiều hơn.xy

Có một số cách khác để kiểm tra điều này?



Đó là câu hỏi tương tự, nhưng câu hỏi của tôi chỉ yêu cầu kiểm tra nếu chỉ có một hoặc nhiều.
ai đó12321

@Eugene Rất giống, nhưng tôi nghĩ khó hơn.
Raphael

Câu trả lời:


5

Đề xuất của Raphael sử dụng đường dẫn ngắn nhất 2 lần là đúng nhưng phức tạp hơn mức cần thiết.

Cách tiếp cận của bạn là không khả thi, số lượng chu kỳ là yếu tố trong kích thước của đầu vào.

Đây là một bản phác thảo của một giải pháp kịp thời O(|V|+|E|).

Tìm một con đường p1,pn từ x đến y trong O(|V|+|E|). Nếu không có con đường như vậy tồn tại, trả lờiNO. Nếu không, đánh dấu tất cả các nút trong đường dẫn. Đường dẫn đó thực sự là duy nhất khi và chỉ khi không có nút nào trong đường dẫn đó đến một nút đi sau nó. Bắt đầu từ nút đầu tiên của đường dẫnp1, chọn một cạnh ngẫu nhiên đi ra từ p1 khác với cái kết nối nó với p2và bắt đầu một DFS từ đó. Nếu bạn đạt đến một nút được đánh dấu, hãy trả lờiNO, nếu bạn không bao giờ đạt đến một nút được đánh dấu, hãy cắt nhánh đó khỏi biểu đồ và chọn một cạnh ra ngẫu nhiên khác. Tiếp tục theo cách tương tự cho đến khi tất cả các cạnh đi hết, sau đó bắt đầu lại với nút sau cho đến khi bạn đạt đượcpn. Nếu bạn hoàn thành thủ tục mà không bao giờ trả lờiNO, câu trả lời YES. Toàn bộ thủ tục có chi phí của một DFS,O(|V|+|E|), do đó tổng thời gian là O(|V|+|E|).


Khi bạn nói "cắt nhánh đó khỏi biểu đồ", bạn có nghĩa là loại bỏ tất cả các cạnh bạn đã đi qua? Điều này thực sự sẽ không được thực hiện cùng một lúc vào cuối DFS; nó sẽ được thực hiện trên đường trở lại "lên" trong chính DFS. Đúng? Tôi có ý nghĩa với nó với một chút suy nghĩ nhưng nó có thể được giải thích rõ ràng hơn.
tự đại diện

1
Bạn đang đề cập đến câu trả lời nào trong hai câu trả lời của Raphael? Ồ, có lẽ là cái đã được đăng trước câu trả lời của bạn, chứ không phải là cái được đăng sau đó. :-) Chỉnh sửa để làm rõ.
David Richerby

@Wildcard: Vâng, bạn sẽ không thực sự "cắt" bất cứ điều gì, tôi đã viết nó như thế bởi vì tôi cảm thấy nó đã cho ý tưởng về những gì tôi đang cố gắng thực hiện, nhưng trong một triển khai thực tế tôi cho rằng bạn sẽ đánh dấu các nút đó bằng cách nào đó truy cập trong chính DFS.
quicksort

2

Chạy thuật toán đường dẫn ngắn nhất k vớik=2 và quan sát xem nó có thất bại không.


3
Đó có phải là quá mức không? Lập trình động giải quyết nó trong O (| V | + | E |)
quicksort

@quicksort Ahh, tôi xin mở rộng câu hỏi về những con đường ngắn nhất trong đầu, xin lỗi. : D Vui lòng thêm câu trả lời khác!
Raphael

2

Nếu có một đường dẫn từ nguồn xđến một chu kỳ nào đó không phải lúc nào cũng mâu thuẫn với sự tồn tại của một con đường đơn giản. Hãy xem ví dụ sau: nhập mô tả hình ảnh ở đây

Ở đây có một chu kỳ có thể đạt được từ xy. Vấn đề này có thể được giải quyết trongO(|V|+|E|).

Bạn có thể chạy BFS để tìm khoảng cách ngắn nhất từ x đến mọi đỉnh trên biểu đồ và giống nhau từ y. Một nút thuộc về đường dẫn ngắn nhất từx đến y nếu và chỉ nếu

distance(x,u)+distance(u,y)=distance(x,y)
Bây giờ, để kiểm tra xem có một đường dẫn đơn hay không, hãy kiểm tra xem các nút hợp lệ trong đường dẫn ngắn nhất ở mọi khoảng cách xảy ra nhiều nhất một lần. Đây là, nếu có ít nhất hai nút thuộc về một con đường ngắn nhất từx đến y có cùng khoảng cách với xsau đó, có ít nhất hai con đường ngắn nhất, nếu không nó là duy nhất. Bạn có thể thực hiện tất cả xử lý hậu kỳ trongO(|V|).

Hãy nhìn xem, chúng ta không muốn có nếu có hai đường dẫn giống nhau, nhưng chỉ để kiểm tra xem có hai đường khác nhau không
ai đó12321

Tôi hiểu rồi, tôi không biết tại sao tôi nghĩ rằng cả hai con đường đều có độ dài tối thiểu. Dù sao, tôi hy vọng bạn thấy hữu ích ví dụ trên, nó vẫn giữ.
Marcelo Fornet

0

Thực hiện tìm kiếm theo chiều sâu bắt đầu từ xvà chú thích các cạnh tùy theo chúng là cạnh cây, mặt sau hay cạnh chéo (ví dụ ở đây ).

Có nhiều hơn một con đường đơn giản từ x đến y nếu và chỉ khi có (ít nhất) một nút trên đường dẫn từ x đến y chỉ sử dụng các cạnh cây (tức là đường dẫn được tìm thấy bởi DFS) là sự cố đối với cạnh sau hoặc cạnh chéo.

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.