canuc80k3303·4/50

Miền Kết Nối Tốt Nhất

Nộp bài trên LQDOJ

Bài 3.4 · Rerooting DP

Một cây có đỉnh. Mỗi đỉnh mang màu trắng hoặc đen. Một tập đỉnh được gọi là liên thông khi giữa hai đỉnh bất kỳ trong tập, toàn bộ các đỉnh trên đường đi duy nhất của chúng cũng thuộc tập.

Điểm của một tập liên thông bằng số đỉnh trắng trừ số đỉnh đen trong tập. Với mỗi đỉnh , hãy tìm điểm lớn nhất của một tập liên thông có chứa .

Input

  • Dòng đầu chứa số nguyên .
  • Dòng thứ hai chứa số . Giá trị biểu thị đỉnh trắng, còn biểu thị đỉnh đen.

  • Mỗi dòng trong dòng tiếp theo chứa hai số nguyên và , mô tả một cạnh vô hướng của cây.

Output

  • In số nguyên trên một dòng. Số thứ là điểm lớn nhất của một tập liên thông chứa đỉnh .

Constraints

  • .
  • thuộc .
  • và .
  • Các cạnh tạo thành một cây.
  • Mỗi giới hạn trên áp dụng cho một test độc lập.

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

5
1 0 1 1 0
1 2
2 3
2 4
4 5

Output

2 2 2 2 1

Giải thích: Tập liên thông và có ba đỉnh trắng, một đỉnh đen nên đạt điểm cho bốn đỉnh đầu. Để chứa đỉnh , chọn cả cây cho điểm , lớn hơn mọi lựa chọn chỉ nằm ở nhánh .

Lời giải tóm tắt
  • Phân tích: Gán trọng số +1 cho đỉnh trắng và -1 cho đỉnh đen. Với một gốc tạm, down[u] là tổng tốt nhất của một tập liên thông nằm trong cây con và chứa u; mỗi nhánh con chỉ nên được lấy khi đóng góp của nó dương.
  • Thuật toán: Tính down[u] = weight[u] + sum(max(0, down[v])). Đặt đáp án ở gốc bằng down[root]. Khi truyền từ u sang con v, bỏ max(0,down[v]) khỏi đáp án của u; phần còn lại chỉ được nối vào v nếu dương. Do đó ans[v] = down[v] + max(0, ans[u] - max(0,down[v])).
  • Chứng minh: Một tập liên thông chứa u giao với mỗi nhánh kề u thành một tập liên thông chứa đỉnh đầu nhánh hoặc rỗng. Vì các nhánh độc lập, chỉ đóng góp dương mới nên được lấy. Công thức đi xuống tối ưu các nhánh con; công thức reroot loại chính nhánh v rồi gộp tối ưu tất cả phía còn lại, nên không đếm trùng và xét đủ mọi tập chứa v.
  • Độ phức tạp: Thời gian O(n), bộ nhớ O(n).