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:
HungTV
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:

  1. Đếm số lượng thành phần liên thông của đồ thị.
  2. 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

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.