canuc80k3711·12/50

Tách Mạng Thành Hai Vùng

Nộp bài trên LQDOJ

Bài 37 · Minimum Spanning Tree

Có điểm dân cư và tuyến đường hai chiều. Tuyến đường nối với có chi phí duy trì . Mạng ban đầu liên thông.

Bạn cần giữ lại một số tuyến đường sao cho:

  • toàn bộ điểm dân cư được chia thành đúng hai nhóm không rỗng;
  • trong mỗi nhóm, mọi cặp điểm đều đi được tới nhau chỉ bằng các đường được giữ;
  • không cần giữ đường nối giữa hai nhóm.

Hãy tìm tổng chi phí duy trì nhỏ nhất của các đường còn lại.

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 tuyến đường vô hướng.

Output

  • In một số nguyên - tổng chi phí nhỏ nhất sau khi tách mạng thành đúng hai nhóm.

Constraints

  • .
  • .
  • .
  • .
  • Mạng ban đầu liên thông; có thể có nhiều tuyến đường giữa cùng một cặp điểm.

Scoring

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

Example

Test 1

Input

6 8
1 2 3
2 3 2
1 3 6
3 4 8
4 5 1
5 6 4
4 6 5
2 5 7

Output

10

Giải thích: Giữ các đường 4-5, 2-3, 1-2 và 5-6, tổng chi phí . Khi đó hai nhóm liên thông là và .

Lời giải tóm tắt
  • Ý tưởng: Một phương án hợp lệ tối ưu luôn có thể bỏ các cạnh dư trên chu trình, nên còn đúng một rừng khung gồm hai cây và n-2 cạnh. Vì vậy, sắp cạnh tăng dần và chạy Kruskal, nhưng dừng ngay sau lần hợp nhất thứ n-2. Tổng các cạnh đã chọn là đáp án.
  • Ý tưởng: Kruskal có tính chất mạnh hơn việc chỉ tạo MST: sau mỗi số lần hợp nhất cố định, tập cạnh đã chọn có tổng nhỏ nhất trong mọi rừng không chu trình với cùng số cạnh. Do đó sau n-2 lần hợp nhất, ta nhận được rừng hai thành phần rẻ nhất. Cách nhìn tương đương là xây một MST rồi bỏ một cạnh nặng nhất của cây đó.
  • Ý tưởng: Độ phức tạp là O(m log m) thời gian và O(n+m) bộ nhớ.
  • Ý tưởng: Bốn cạnh có chi phí 1,2,3,4 tạo đúng hai cây trên hai nhóm {1,2,3} và {4,5,6}, nên tổng cần duy trì là 10.