Bài 13.1 - Thuật toán Dijkstra với Python sử dụng heapq
Free
Khóa học Python từ Cơ bản đến Nâng cao
Chương 1: Làm quen với Python + Ôn tập I/O, biến, kiểu dữ liệu
Chương 2: Câu lệnh rẽ nhánh, vòng lặp, hàm
Chương 3: Xử lý chuỗi và danh sách nâng cao
Chương 4: Bài kiểm tra Python cơ bản + sửa bài
Chương 5: Duyệt mảng, tìm max/min, đếm
Chương 6: Thuật toán sắp xếp
Chương 7: Prefix Sum + Two Pointers
Chương 8: Backtracking cơ bản
Chương 9: Ôn tập thuật toán cơ bản + kiểm tra
Chương 10: Dynamic Programming cơ bản
Chương 11: Đệ quy và DP nâng cao
Chương 12: Đồ thị cơ bản – DFS, BFS
Chương 13: Đồ thị nâng cao – Dijkstra + Topo sort
Chương 14: Cây – Tree traversal + LCA
Chương 15: Bitmask – Kỹ thuật đại số
Chương 16: Số học + Modular Arithmetic
Chương 17: Class
Chương 18: File và Exception

Bài 13.1 - Thuật toán Dijkstra với Python sử dụng heapq
Dijkstra là thuật toán nổi tiếng dùng để tìm đường đi ngắn nhất từ một đỉnh đến tất cả các đỉnh còn lại trong đồ thị có trọng số không âm.
Trong Python, ta có thể kết hợp thuật toán Dijkstra với thư viện heapq
để cải thiện tốc độ nhờ vào priority queue (hàng đợi ưu tiên).
Ý tưởng cơ bản
- Sử dụng min-heap để luôn chọn đỉnh có khoảng cách ngắn nhất hiện tại.
- Cập nhật khoảng cách tới các đỉnh kề nếu tìm được đường đi ngắn hơn.
- Lặp lại cho đến khi duyệt hết toàn bộ các đỉnh.
Cấu trúc đồ thị
Ta sẽ dùng adjacency list, với mỗi đỉnh ánh xạ tới danh sách các cặp (đỉnh_kề, trọng_số).
graph = {
'A': [('B', 1), ('C', 4)],
'B': [('A', 1), ('C', 2), ('D', 5)],
'C': [('A', 4), ('B', 2), ('D', 1)],
'D': [('B', 5), ('C', 1)]
}
Cài đặt Dijkstra với heapq
import heapq
def dijkstra(graph, start):
# Khởi tạo khoảng cách ban đầu: vô cùng
distances = {node: float('inf') for node in graph}
distances[start] = 0
# Min-heap: (khoảng cách, đỉnh)
heap = [(0, start)]
while heap:
current_dist, current_node = heapq.heappop(heap)
# Nếu tìm được đường đi ngắn hơn rồi thì bỏ qua
if current_dist > distances[current_node]:
continue
for neighbor, weight in graph[current_node]:
distance = current_dist + weight
if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(heap, (distance, neighbor))
return distances
Ví dụ minh hoạ
graph = {
'A': [('B', 1), ('C', 4)],
'B': [('A', 1), ('C', 2), ('D', 5)],
'C': [('A', 4), ('B', 2), ('D', 1)],
'D': [('B', 5), ('C', 1)]
}
distances = dijkstra(graph, 'A')
print("Khoảng cách từ A đến các đỉnh:", distances)
Kết quả:
Khoảng cách từ A đến các đỉnh: {'A': 0, 'B': 1, 'C': 3, 'D': 4}
Giải thích:
- A đến B: 1
- A → B → C: 1 + 2 = 3
- A → B → C → D: 1 + 2 + 1 = 4
Giải thích code
distances
: dictionary lưu khoảng cách ngắn nhất từstart
đến các đỉnh.heap
: giúp chọn đỉnh có khoảng cách nhỏ nhất nhanh chóng (O(log n)).- Kiểm tra
if current_dist > distances[current_node]
để tránh xử lý lại đỉnh đã tối ưu.
Độ phức tạp
Thành phần | Giá trị |
---|---|
Thời gian | O((V + E) * log V) |
Bộ nhớ | O(V) |
V
: số đỉnhE
: số cạnhheapq
giúp tối ưu thay vì tìm tuyến tính như Dijkstra truyền thống.
Gợi ý mở rộng
- Truy vết đường đi (không chỉ khoảng cách).
- Chạy Dijkstra từ nhiều điểm xuất phát.
- Áp dụng với bản đồ, game pathfinding, router networks.
Tổng kết
- Dijkstra + heapq là công cụ mạnh để tìm đường đi ngắn nhất trong đồ thị có trọng số không âm.
- Cài đặt đơn giản, dễ mở rộng và ứng dụng thực tế rất nhiều.
- Hiểu được thuật toán này là một bước quan trọng để học A*, Bellman-Ford, và các thuật toán mạng phức tạp hơn.
Khóa học liên quan

3300000
4500000
Học Ngay
Comments