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.
Tiến độ của tôi ở bài này
Điểm và code bạn nộp đượ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ủ đề
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ế.
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.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
