Lưu ý: câu trả lời đã được chỉnh sửa.
Bất kỳ phương pháp nào cũng có thể rất chậm. Nếu bạn cần làm điều này nhiều lần, tốt nhất là tìm các thành phần được kết nối của biểu đồ, sau đó tác vụ trở thành hoạt động O (1) tầm thường: nếu hai người ở cùng một thành phần, chúng được kết nối.
Lưu ý rằng việc tìm kiếm các thành phần được kết nối lần đầu tiên có thể chậm, nhưng giữ chúng được cập nhật khi các cạnh/nút mới được thêm vào biểu đồ nhanh.
Có một số phương pháp để tìm các thành phần được kết nối.
Một phương pháp là xây dựng Laplacian của biểu đồ và xem giá trị riêng của nó/giá trị riêng. Số lượng các giá trị riêng của số không cho bạn số lượng các thành phần được kết nối. Các phần tử khác không của các phần tử riêng tương ứng cho các nút thuộc về các thành phần tương ứng.
Một cách khác là dọc theo dòng sau đây:
Tạo một bảng chuyển đổi của các nút. Phần tử n
của mảng chứa chỉ mục của nút mà nút n
chuyển đổi thành.
Vòng qua tất cả các cạnh (i,j)
trong đồ thị (biểu thị một mối liên hệ giữa i
và j
):
- Tính đệ quy mà nút làm
i
và j
chuyển tới căn cứ vào bảng hiện tại. Hãy để chúng tôi biểu thị kết quả theo số k
và l
. Cập nhật mục nhập k
để biến nó thành l
. Cập nhật các mục i
và j
để trỏ tới l
.
Vòng qua bàn một lần nữa, và cập nhật mỗi mục để chỉ trực tiếp đến nút nó đệ quy chuyển đến.
Bây giờ các nút trong cùng một thành phần được kết nối sẽ có cùng mục nhập trong bảng chuyển đổi. Vì vậy, để kiểm tra xem hai nút được kết nối, chỉ cần kiểm tra xem chúng có chuyển đổi thành cùng một giá trị hay không.
Mỗi khi một nút hoặc cạnh mới được thêm vào biểu đồ, bảng chuyển đổi cần phải được cập nhật, nhưng bản cập nhật này sẽ nhanh hơn nhiều so với tính toán ban đầu của bảng.
DFS sẽ mang lại ... kết quả thú vị. Alice biết Bob. Alice cũng biết Carol, người biết Dave, người biết Eve, ai biết được Bob. DFS cũng có khả năng trả lại Alice-> Carol-> Dave-> Eve-> Bob vì đó là Alice-> Bob. :) –