cpp-017Đọc toàn bộ đề miễn phí

Duyệt đồ thị BFS tìm đường đi ngắn nhất không trọng số

Mạng lưới máy chủ của AI Empire Academy gồm V máy chủ được đánh số từ 1 đến V và E kênh truyền thông hai chiều nối giữa các máy chủ (1 ≤ V ≤ 105, 0 ≤ E ≤ 2 · 105). Mỗ…

C++Nâng cao35 phút

Tiến độ của tôi ở bài này

Điểm được lưu vào tài khoản sau khi chấm bài.

Đang tải điểm của bạn…

Kiến thức và chủ đề

graphsbfsshortest pathqueuetraceback

Kiến thức tiên quyết: std queue, std vector, graph representation.

Nội dung đề bài

Mục tiêu kiến thức

  • Biểu diễn đồ thị vô hướng bằng danh sách kề std::vector<std::vector<int>>.
  • Cài đặt thuật toán Duyệt theo chiều rộng (Breadth-First Search - BFS) bằng hàng đợi std::queue.
  • Tính khoảng cách ngắn nhất (số cạnh ít nhất) từ đỉnh nguồn đến tất cả các đỉnh trong O(V + E).
  • Kỹ thuật truy vết đường đi bằng mảng parent.

Mô tả bài toán

Mạng lưới máy chủ của AI Empire Academy gồm V máy chủ được đánh số từ 1 đến V và E kênh truyền thông hai chiều nối giữa các máy chủ (1 ≤ V ≤ 105, 0 ≤ E ≤ 2 · 105). Mỗi kênh truyền thông có độ trễ bằng nhau (coi như trọng số bằng 1).

Cho trước máy chủ nguồn S và máy chủ đích T (1 ≤ S, T ≤ V). Bạn hãy viết chương trình:

  • Tìm khoảng cách ngắn nhất (số kênh truyền ít nhất) từ S đến T. Nếu không có đường truyền nào kết nối giữa S và T, in ra -1.
  • Nếu có đường đi, in ra đường đi cụ thể gồm danh sách các đỉnh từ S đến T (các đỉnh cách nhau bởi dấu cách). Nếu có nhiều đường đi ngắn nhất cùng độ dài, in ra một đường đi hợp lệ bất kỳ.

Quy ước nộp bài

  • Chỉ cần viết một chương trình đọc stdin và in ra stdout. Bài này không yêu cầu viết hàm.
  • Không dùng cout để in lời nhắc trước khi đọc dữ liệu. Lời nhắc sẽ lọt vào stdout và làm bài sai.
  • Chỉ in đúng nội dung ở mục Output. Không in thêm nhãn, dòng trống hay ký tự thừa.
  • Output được so khớp từng ký tự, phân biệt chữ hoa/thường và dấu câu.

Input

  • Dòng 1: Gồm 4 số nguyên V, E, S, T (1 ≤ V ≤ 105, 0 ≤ E ≤ 2 · 105, 1 ≤ S, T ≤ V).
  • E dòng tiếp theo: Mỗi dòng gồm 2 số nguyên u, v (1 ≤ u, v ≤ V, u ≠ v) thể hiện có kênh truyền hai chiều giữa máy chủ u và máy chủ v. Đồ thị không chứa cạnh lặp.

Output

  • Nếu không có đường đi: In ra -1.
  • Nếu có đường đi:
  • Dòng 1: In một số nguyên là khoảng cách ngắn nhất (số cạnh).
  • Dòng 2: In danh sách các đỉnh trên đường đi từ S đến T theo thứ tự, cách nhau bởi một dấu cách.

Ràng buộc

  • 1 ≤ V ≤ 105.
  • 0 ≤ E ≤ 2 · 105.
  • 1 ≤ S, T ≤ V.
  • Thời gian chạy: 1000ms.
  • Bộ nhớ tối đa: 256MB.

Ví dụ 1

Input

5 5 1 5
1 2
2 3
3 5
1 4
4 5

Output

2
1 4 5

Giải thích

Từ đỉnh 1 đến đỉnh 5 có 2 đường đi:

  • 1 → 2 → 3 → 5 (độ dài 3 cạnh).
  • 1 → 4 → 5 (độ dài 2 cạnh).

Đường đi ngắn nhất có độ dài là 2 cạnh, đi qua các đỉnh 1 4 5.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.