Thành phần liên thông
Xem dạng PDF
Gửi bài giải
Điểm:
750,00 (OI)
Giới hạn thời gian:
1.0s
Giới hạn bộ nhớ:
256M
Input:
stdin
Output:
stdout
Nguồn bài:
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch
Một đồ thị vô hướng gồm ~ n ~ đỉnh và ~ m ~ cạnh được biểu diễn bằng danh sách kề.
Hai đỉnh được gọi là thuộc cùng một thành phần liên thông nếu tồn tại đường đi giữa chúng thông qua các cạnh của đồ thị.
Hãy:
- Đếm số lượng thành phần liên thông của đồ thị.
- In ra danh sách các đỉnh thuộc từng thành phần liên thông (mỗi thành phần là một dòng, các đỉnh được in theo thứ tự từ bé đến lớn).
Input
Dòng đầu tiên chứa hai số nguyên ~ n ~, ~ m ~ — số đỉnh và số cạnh.
(1 ≤ ~ n ~ ≤ 100000, 0 ≤ ~ m ~ ≤ 200000)Tiếp theo là ~ m ~ dòng, mỗi dòng chứa hai số nguyên ~ u, v ~ — biểu diễn một cạnh nối giữa đỉnh ~ u ~ và đỉnh ~ v ~.
(1 ≤ ~ u, v ~ ≤ ~ n ~, ~ u \ne v ~)
Output
- Dòng đầu tiên: In ra số lượng thành phần liên thông của đồ thị.
- Mỗi dòng tiếp theo: In ra danh sách các đỉnh thuộc một thành phần liên thông, theo thứ tự từ bé đến lớn, các đỉnh cách nhau bởi dấu cách.
Ví dụ
Input
8 5
1 2
2 3
4 5
6 7
7 8
Output
3
1 2 3
4 5
6 7 8
Giải thích
- Có 3 thành phần liên thông:
- {1, 2, 3}
- {4, 5}
- {6, 7, 8}
Chấm điểm
| Subtask | Giới hạn | Điểm |
|---|---|---|
| 1 | ~ n \le 1000, m \le 2000 ~ | 50 |
| 2 | ~ n \le 10^5, m \le 2 \cdot 10^5 ~ | 50 |
Chương trình cần chạy đúng và trong giới hạn thời gian với mọi subtask để đạt điểm tối đa.
Lưu ý
- Bạn cần sử dụng DFS để duyệt đồ thị.
- Có thể sử dụng danh sách kề để lưu đồ thị.
Bình luận