canuc80k1501·2/50

Bộ Chìa Khóa Tối Thiểu

Nộp bài trên LQDOJ

Bài 15 · Bitmask DP

Có ổ khóa được đánh số từ đến . Cửa hàng bán chìa khóa khác nhau. Chìa khóa thứ có giá và có thể mở một tập ổ khóa đã biết.

Bạn có thể mua bất kỳ tập con nào trong chìa khóa, mỗi chìa nhiều nhất một lần. Một chìa đã mua có thể được dùng lại, nhưng mỗi ổ chỉ cần được mở ít nhất một lần.

Hãy tìm tổng tiền nhỏ nhất để mở được toàn bộ ổ khóa.

Input

  • Dòng đầu chứa hai số nguyên .
  • Với mỗi chìa khóa :
  • một dòng chứa - giá của chìa và số ổ chìa đó mở được;
  • dòng kế tiếp chứa số nguyên tăng dần, là chỉ số các ổ khóa được mở.

Output

  • In tổng tiền nhỏ nhất để mở được toàn bộ ổ khóa. Nếu không tồn tại cách mua phù hợp, in .

Constraints

  • .
  • .
  • .
  • .
  • Mỗi chỉ số ổ nằm trong ; danh sách của một chìa tăng строго và không lặp.

Scoring

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

Example

Test 1

Input

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

Output

9

Giải thích: Mua hai chìa đầu tiên tốn và mở đủ ba ổ. Mọi lựa chọn rẻ hơn đều bỏ sót ít nhất một ổ.

Lời giải tóm tắt
  • Ý tưởng: Biểu diễn tập ổ đã mở bằng một mask N bit. dp[mask] là chi phí nhỏ nhất sau khi đã xét một tiền tố các chìa và mở được đúng tập trong mask; ban đầu dp[0]=0.
  • Ý tưởng: Với mỗi chìa có giá cost và mask key, ta tạo next=dp. Nhánh không mua giữ nguyên trạng thái; nhánh mua chuyển mask sang mask | key với chi phí cộng thêm cost. Sau khi xử lý hết chìa, trạng thái đủ 2^N-1 là đáp án.
  • Ý tưởng: Chứng minh đúng. Quy nạp theo số chìa đã xét. Mọi tập mua từ tiền tố hoặc không chứa chìa hiện tại, hoặc chứa nó đúng một lần; hai trường hợp tương ứng chính xác với hai nhánh cập nhật. Phép OR mô tả đúng tập ổ đã mở, và phép min giữ chi phí tốt nhất cho mỗi tập. Vì vậy trạng thái cuối cho chi phí tối ưu, hoặc vô cùng nếu không thể phủ đủ.
  • Ý tưởng: Độ phức tạp. O(M·2^N) thời gian và O(2^N) bộ nhớ.