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 đượ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
ValueErrornế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ệ:
ValueErrorkhi 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.
