python-073Đọc toàn bộ đề miễn phí

Thuật toán Dijkstra tìm đường đi ngắn nhất đồ thị có trọng số

Cho đồ thị có hướng gồm n đỉnh (được đánh số từ 0 đến n - 1) và danh sách các cạnh edges dạng (u, v, w) biểu thị cạnh từ u → v có trọng số w.

PythonNâ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ủ đề

graphsdijkstraheapqshortest path

Kiến thức tiên quyết: priority queue, graphs.

Nội dung đề bài

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

  • Triển khai thuật toán Dijkstra sử dụng hàng đợi ưu tiên heapq đạt độ phức tạp O((V + E) log V).
  • Truy vết đường đi ngắn nhất từ đỉnh nguồn đến toàn bộ các đỉnh khác bằng mảng prev.
  • Xử lý các đỉnh không thể đến được (khoảng cách vô cực float('inf') và đường đi []).
  • Kiểm tra hợp lệ: raise ValueError nếu phát hiện cạnh có trọng số âm.

Mô tả bài toán

Cho đồ thị có hướng gồm n đỉnh (được đánh số từ 0 đến n - 1) và danh sách các cạnh edges dạng (u, v, w) biểu thị cạnh từ u → v có trọng số w.

Viết hàm dijkstra_shortest_path(n: int, edges: list[tuple[int, int, int]], source: int) -> tuple[list[int | float], dict[int, list[int]]]:

  • Kiểm tra trọng số: nếu có bất kỳ cạnh nào có trọng số w < 0, raise ValueError("Trong so canh khong duoc am").
  • Tính khoảng cách ngắn nhất từ đỉnh source đến tất cả các đỉnh từ 0 đến n - 1.
  • Tái tạo đường đi ngắn nhất chi tiết:
  • Với mỗi đỉnh i, paths[i] là danh sách các đỉnh từ source đến i (ví dụ [source, ..., i]).
  • Riêng paths[source] = [source].
  • Nếu đỉnh i không thể đến được từ source, khoảng cách là float('inf') và paths[i] = [].

Input

  • Tham số: n: int, edges: list[tuple[int, int, int]], source: int.

Output

  • Trả về: tuple[list[int | float], dict[int, list[int]]].
  • Ngoại lệ: ValueError khi có cạnh âm.

Ràng buộc

  • Thời gian chạy tối đa: 1000ms.
  • Giới hạn bộ nhớ: 256MB.
  • Dữ liệu đầu vào tuân thủ đúng kiểu dữ liệu và miền giá trị được mô tả.

Ví dụ 1

Input

dijkstra_shortest_path(4, [[0, 1, 1], [0, 2, 4], [1, 2, 2], [2, 3, 1]], 0)

Output

[[0, 1, 3, 4], {'0': [0], '1': [0, 1], '2': [0, 1, 2], '3': [0, 1, 2, 3]}]

Giải thích

Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.

Ví dụ 2

Input

dijkstra_shortest_path(3, [[0, 1, 5]], 0)

Output

[[0, 5, 'inf'], {'0': [0], '1': [0, 1], '2': []}]

Giải thích

Hàm được gọi với bộ tham số thứ hai và trả về kết quả tương ứng theo thiết kế.

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.