canuc80k3729·30/50

Cây Khung Bắt Buộc Từng Cạnh

Nộp bài trên LQDOJ

Bài 3.8 · Minimum Spanning Tree

Cho một đồ thị vô hướng liên thông có đỉnh và cạnh có trọng số. Đồ thị không có khuyên và không có hai cạnh nối cùng một cặp đỉnh.

Với từng cạnh theo thứ tự xuất hiện trong input, hãy tìm tổng trọng số nhỏ nhất của một cây khung bắt buộc chứa cạnh đó.

Input

  • Dòng đầu chứa hai số nguyên .
  • Mỗi dòng trong dòng tiếp theo chứa ba số nguyên , mô tả một cạnh nối với có trọng số .

Output

  • In dòng. Dòng thứ là tổng trọng số nhỏ nhất của một cây khung chứa cạnh thứ trong input.
  • Nếu , không in dòng nào.

Constraints

  • .
  • .
  • .
  • .
  • Đồ thị liên thông, không có khuyên và không có cạnh song song.

Scoring

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

Example

Test 1

Input

4 5
1 2 1
2 3 2
3 4 3
1 4 10
1 3 4

Output

6
6
6
13
8

Giải thích: Ba cạnh đầu cùng tạo cây khung nhỏ nhất có tổng . Nếu bắt buộc dùng cạnh trọng số , ta thay cạnh trọng số ; còn với cạnh trọng số , ta thay cạnh trọng số .

Lời giải tóm tắt
  • Ý tưởng: Dựng một MST T bằng Kruskal và gọi tổng trọng số của nó là W.
  • Ý tưởng: Với cạnh đầu vào (u,v,w), thêm cạnh này vào T tạo đúng một chu trình. Để còn lại một cây khung chứa cạnh bắt buộc, phải bỏ một cạnh trên đường u-v của T; lựa chọn tốt nhất là bỏ cạnh nặng nhất trên đường. Vì vậy đáp án là
  • Ý tưởng: W + w - maxEdge(u,v).
  • Ý tưởng: Tiền xử lý binary lifting trên T: up[k][v] là tổ tiên cách 2^k, còn maximum[k][v] là trọng số lớn nhất trên đoạn nhảy đó. Mỗi truy vấn đường đi được trả lời trong O(log n).
  • Ý tưởng: Cycle/exchange property bảo đảm không cây khung chứa cạnh bắt buộc nào rẻ hơn phép thay trên, còn phép thay tạo ra một cây đạt đúng công thức.
  • Ý tưởng: Độ phức tạp O(m log m + (n+m) log n), bộ nhớ O((n+m) log n).