Truy vấn kết nối có hoàn tác
Đề bài
Mô tả
Cho một đồ thị vô hướng có đỉnh, ban đầu không có cạnh nào. Đỉnh được đánh số từ đến .
Bạn cần xử lý thao tác, mỗi thao tác có một trong ba dạng sau:
+ u v— Thêm một cạnh nối hai đỉnh và . Cho phép có nhiều cạnh trùng nhau giữa cùng một cặp đỉnh (multi-edge).- u v— Xoá một cạnh nối và . Dữ liệu đảm bảo rằng tại thời điểm thao tác này, có ít nhất một cạnh đang tồn tại. Nếu có nhiều cạnh trùng nhau giữa và , chỉ một trong số đó bị xoá.? u v— Truy vấn: hãy in YES nếu và đang nằm trong cùng một thành phần liên thông sau tất cả các thao tác đã thực hiện trước đó, ngược lại in NO.
Lưu ý: cạnh là vô hướng, và một đỉnh luôn liên thông với chính nó (truy vấn dạng ? u u luôn trả lời YES).
Dữ liệu vào
- Dòng đầu chứa hai số nguyên và .
- dòng tiếp theo, mỗi dòng là một trong ba thao tác được mô tả ở trên: một ký tự (
+,-hoặc?) theo sau là hai số nguyên , .
Dữ liệu ra
Với mỗi thao tác ?, in một dòng chứa YES hoặc NO theo thứ tự xuất hiện của truy vấn.
Ràng buộc
- Với mọi thao tác
- u v, đảm bảo có ít nhất một cạnh đang tồn tại tại thời điểm đó.
Ví dụ
| Input | Output | Giải thích |
|---|---|---|
| 4 7 + 1 2 + 2 3 ? 1 3 - 2 3 ? 1 3 + 3 4 ? 1 4 |
YES NO NO |
Sau hai phép thêm đầu tiên, các đỉnh 1-2-3 cùng thành phần nên truy vấn 1 trả lời YES. Sau khi xoá cạnh (2,3), đỉnh 3 tách khỏi {1,2}, nên truy vấn 2 trả lời NO. Cạnh (3,4) chỉ nối 3 với 4 mà không nối lại 3 với 1, nên truy vấn 3 trả lời NO. |
| 3 5 + 1 2 + 1 2 - 1 2 ? 1 2 ? 2 3 |
YES NO |
Có hai cạnh song song giữa 1 và 2. Xoá một cạnh vẫn còn một cạnh nối 1 với 2, nên truy vấn đầu trả lời YES. Đỉnh 3 cô lập, nên truy vấn sau trả lời NO. |
Ghi chú
Bài toán yêu cầu xử lý cả phép thêm và phép xoá cạnh. Cấu trúc Union-Find thông thường không hỗ trợ xoá hiệu quả. Hãy nghĩ cách xử lý offline: đọc trước toàn bộ thao tác, sau đó xử lý chúng theo một thứ tự khéo léo hơn.
Bình luận