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

  1. Tìm tất cả các đỉnh mà ta có thể đi từ ~ s ~ đến được, theo thứ tự duyệt DFS.
  2. 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

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.