canuc80k3006·7/50

Chia Hai Nhóm Tương Khắc

Nộp bài trên LQDOJ

Bài 30 · DFS and BFS

Có thành viên và cặp không được xếp chung nhóm. Cần gán mỗi thành viên vào nhóm hoặc nhóm sao cho hai thành viên của mọi cặp đã cho luôn thuộc hai nhóm khác nhau. Kích thước hai nhóm không cần bằng nhau.

Hãy in một cách chia hợp lệ, hoặc kết luận rằng không thể thực hiện.

Input

  • Dòng đầu chứa hai số nguyên và .
  • Mỗi dòng trong dòng tiếp theo chứa hai số nguyên và , mô tả một cặp không được cùng nhóm. Không có cặp trùng và .

Output

  • Nếu có cách chia, in số; số thứ là hoặc , biểu thị nhóm của thành viên . Có thể in bất kỳ cách chia hợp lệ nào.

  • Nếu không có cách chia, in IMPOSSIBLE.

Constraints

  • .
  • .
  • .

Scoring

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

Example

Test 1

Input

6 4
1 2
2 3
4 5
5 6

Output

1 2 1 1 2 1

Giải thích: Mỗi cặp bị ràng buộc có hai đầu nhận hai số khác nhau, nên cách chia đã in là hợp lệ.

Lời giải tóm tắt
  • Ý tưởng: Dùng mảng color, trong đó 0 là chưa gán, còn 1 và 2 là hai nhóm. Với mỗi đỉnh chưa gán, đặt màu 1 rồi BFS trong thành phần của nó. Trên cạnh v-to:
  • Ý tưởng: nếu to chưa có màu, gán 3-color[v];
  • Ý tưởng: nếu to có cùng màu với v, in IMPOSSIBLE.
  • Ý tưởng: Nếu BFS hoàn tất, mọi cạnh đã được kiểm tra và hai đầu khác màu, nên cách chia hợp lệ. Nếu gặp cạnh cùng màu, phép lan truyền màu đối lập quanh một chu trình lẻ tạo mâu thuẫn; không tồn tại cách tô hai màu nào. Vì thuật toán khởi động ở mọi thành phần, nó không bỏ sót ràng buộc trong phần đồ thị rời.
  • Ý tưởng: Độ phức tạp O(n+m) thời gian và bộ nhớ.