Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
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.
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.
Hướng tiếp cận
Với mỗi đỉnh , gọi là tổng trọng số trên đường đi từ gốc đến . Khi đó:
với . Sau khi tính sẵn cho mọi đỉnh bằng một lần DFS, mỗi truy vấn chỉ cần in ra trong .
Nhận xét quan trọng
- Vì và cây có thể sâu tới đỉnh, tổng có thể đạt đến — vượt phạm vi
int. Phải dùnglong long. - Cây có thể là một đường thẳng dài (n = 2·10⁵). DFS đệ quy có thể gây tràn stack — nên dùng DFS lặp (stack thủ công) hoặc tăng
sys.setrecursionlimittrong Python (nhưng đệ quy Python sâu 2·10⁵ vẫn rất chậm và có thể vẫn lỗi). Triển khai DFS lặp là an toàn nhất.
Thuật toán
- Đọc , mảng trọng số , các cạnh, dựng danh sách kề.
- Chạy DFS lặp từ đỉnh :
- Dùng một stack chứa .
- Khi pop một đỉnh , gán (riêng gốc thì ).
- Đẩy các con của (mọi hàng xóm khác parent) vào stack.
- Với mỗi truy vấn , in ra .
Độ phức tạp
- Thời gian: .
- Bộ nhớ: .
Bình luận