Hướng dẫn giải của Bò Lân Cận
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lời giải: Bò Lân Cận
Hướng tiếp cận
Bài toán yêu cầu tính, với mỗi đỉnh trên cây, tổng số bò trong khoảng cách cạnh từ .
Cách tiếp cận trực tiếp — với mỗi đỉnh , BFS/DFS sâu tầng — có độ phức tạp với hằng số lớn. Tuy nhiên, có một công thức DP thanh lịch hơn trên cây.
Nhận xét quan trọng
Định nghĩa = tổng số bò trong khoảng cách đúng bằng từ đỉnh .
- (chỉ bò tại đỉnh ).
- Với : Xét tất cả các hàng xóm của . Mỗi hàng xóm biết số bò trong khoảng cách từ , tức là . Tổng này chứa mọi đỉnh trong khoảng cách từ nhưng đi qua .
Vấn đề: khi cộng cho mọi hàng xóm , đỉnh bản thân nó và các đỉnh trong khoảng cách từ bị đếm nhiều lần — mỗi hàng xóm đều "nhìn thấy" những đỉnh này.
Cụ thể, bị đếm lần (mỗi hàng xóm đóng góp 1 lần), nhưng ta chỉ muốn đếm 1 lần. Do đó ta trừ đi .
Thuật toán
Công thức này chính xác trên cây vì không có chu trình — mỗi đường đi duy nhất, nên việc loại trừ kép được đơn giản hóa như trên.
Cài đặt:
- Đọc đồ thị, khởi tạo .
- Lặp từ 1 đến : với mỗi đỉnh , tính theo công thức trên.
- In cho mỗi .
Tối ưu bộ nhớ: Chỉ cần lưu 3 lớp (lớp hiện tại, lớp , lớp ) bằng mảng xoay (rolling array) kích thước 4, truy cập bằng chỉ số (hoặc ).
Độ phức tạp
- Thời gian: — vòng lặp tầng, mỗi tầng duyệt đỉnh với tổng bậc .
- Bộ nhớ: — chỉ lưu 4 lớp DP, mỗi lớp phần tử.
Với và , thuật toán thực hiện khoảng phép tính — rất nhanh.
Bình luận