Thuật toán DFS trên đồ thị
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
Cho một đồ thị có hướng gồm ~ n ~ đỉnh, được đánh số từ 1 đến ~ n ~. Mỗi đỉnh có thể có nhiều cung đi đến các đỉnh khác (không có cung tự nối).
Bạn được cung cấp hai đỉnh:
- ~ s ~: đỉnh xuất phát
- ~ t ~: đỉnh đích
Yêu cầu:
- Tìm tất cả các đỉnh mà ta có thể đi từ ~ s ~ đến được, theo thứ tự duyệt DFS.
- Nếu tồn tại đường đi từ ~ s ~ đến ~ t ~, hãy in ra một đường đi bất kỳ từ ~ s ~ đến ~ t ~. Ngược lại, in ra
-1.
Input
Gồm ~ n + 1 ~ dòng:
Dòng đầu tiên chứa ba số nguyên:
~ n ~, ~ s ~, ~ t ~ — số đỉnh, đỉnh bắt đầu và đỉnh đích.
(1 ≤ ~ n ~ ≤ 100000, 1 ≤ ~ s, t ~ ≤ ~ n ~)Dòng thứ ~ i+1 ~ (với ~ 1 \le i \le n ~) chứa danh sách các đỉnh mà từ đỉnh ~ i ~ có cung đi tới, kết thúc bằng số
0.
Output
- Dòng đầu tiên: In ra các đỉnh có thể đến được từ ~ s ~, theo thứ tự duyệt DFS (không đệ quy), cách nhau bởi dấu cách.
- Dòng thứ hai:
- Nếu tồn tại đường đi từ ~ s ~ đến ~ t ~, in ra một đường đi bất kỳ (các đỉnh cách nhau bởi dấu cách).
- Nếu không tồn tại đường đi, in ra
-1.
Ví dụ
Input
8 1 5
2 3 0
3 4 0
1 5 0
6 0
0
2 0
8 0
0
Output
1 2 3 5 4 6
1 2 3 5
Giải thích
- Từ đỉnh 1 có thể đến các đỉnh: 2 → 3 → 5 → 4 → 6 (theo DFS).
- Đường đi từ 1 đến 5 có thể là: 1 → 2 → 3 → 5.
Chấm điểm
Bài gồm 2 subtask:
| Subtask | Giới hạn | Điểm |
|---|---|---|
| 1 | ~ n \le 1000 ~, số cung ≤ ~5000~ | 60 |
| 2 | ~ n \le 100000 ~, số cung ≤ ~10^6~ | 40 |
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 ý
- Dữ liệu đảm bảo không có cung tự nối (self-loop).
- Có thể có nhiều cung từ một đỉnh đến các đỉnh khác.
- Không yêu cầu đường đi ngắn nhất, chỉ cần một đường đi bất kỳ từ ~ s ~ đến ~ t ~ là được.
Bình luận