Cho một cây, tìm một đỉnh tối đa hóa khoảng cách tối thiểu đến bất kỳ lá nào


7

Nếu tôi được đưa ra một biểu đồ tạo thành một cái cây, tôi muốn tìm một đỉnh tối đa hóa khoảng cách tối thiểu đến bất kỳ chiếc lá nào.

Tôi chắc chắn vấn đề này đã được nghiên cứu trước đây. Có ai biết tên của vấn đề này hoặc một thuật toán để giải quyết nó không?


3
Bạn sẽ tìm kiếm trung tâm đồ thị ? Nếu bạn có một cái cây, trung tâm luôn là một đỉnh hoặc một cạnh. Nó có thể được tìm thấy trong thời gian tuyến tính.
Juho

3
@Juho: lưu ý rằng độ lệch tâm tại là khoảng cách lớn nhất của bất kỳ nút nào từ . OP đang hỏi về khoảng cách tối thiểu đến một chiếc lá, thường sẽ khác nhau. Vì vậy, không rõ ràng rằng trung tâm đồ thị, xử lý các đỉnh có độ lệch tâm tối thiểu, là khái niệm thích hợp. vv
Niel de Beaudrap

@NieldeBeaudrap Vâng, điều đó đúng.
Juho

Câu trả lời:


5

Để tìm một đỉnh có khoảng cách tối đa từ bất kỳ chiếc lá nào, bạn có thể thực hiện tìm kiếm đầu tiên theo chiều rộng bắt đầu từ nhiều điểm bắt đầu, tức là các lá. Vì BFS truy cập mỗi nút theo đường dẫn ngắn nhất có thể từ (các) nguồn tìm kiếm, chúng tôi có thể dễ dàng gán cho mỗi nút khoảng cách đến lá gần nhất.

  • Chèn vào hàng đợi một tập hợp các cặp cho nằm trên tất cả các lá và ghi .(,0)max=0

  • Lặp lại như sau cho đến khi hàng đợi trống:

    1. Pop một cặp ra khỏi hàng đợi. Nếu , hãy chèn vào tập hợp các phần tử khoảng cách tối đa.(v,d)d=maxv

    2. Nếu có nút liền kề với chưa được truy cập, đẩy một cặp vào hàng đợi cho mỗi người hàng xóm như , đánh dấu chúng là đã được truy cập. Nếu có bất kỳ nào như vậy , hãy làm trống bộ sưu tập các phần tử khoảng cách tối đa (nếu nó không trống) và đặt .v(w,d+1)wwmax=d+1

Kết quả là một tập hợp các nút nằm ở khoảng cách ít nhất từ bất kỳ lá nào.max

Đặt(lưu ý rằng ). Giả sử rằng chúng ta có thể tạo ra hàng đợi với các lá của cây trong thời gian bằng cách kiểm tra tất cả các nút của biểu đồ và các đỉnh có danh sách kề của hàng xóm của chúng, chúng ta "duyệt" mỗi cạnh hai lần để xem xét các hàng xóm của từng đỉnh; thì thuật toán này mất thời gian . Nó cũng hoạt động cho các cây không, lấy lại thời gian .n=|V|m=|E|=n1O(n)O(n+m)=O(n)O(n+m)


4

Thực hiện tìm kiếm bề rộng đầu tiên từ tất cả các lá song song, tức là truy cập tất cả các neigbours của tất cả các lá, sau đó hàng xóm tương ứng của họ, và như vậy. Nút truy cập cuối cùng là người chiến thắng của bạn.

Nếu bạn để tất cả các tìm kiếm chia sẻ visitedcờ, không có đỉnh nào được truy cập hai lần. Vì chúng ta có một cái cây, mỗi cạnh chỉ được truy cập một lần. Tổng cộng, chúng ta có được thời gian chạy tuyến tính (theo số lượng nút).


Rất tiếc, bạn đánh tôi với nó!
Niel de Beaudrap
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.