Biểu diễn đồ thị
Bạn sẽ học được gì
Trước khi chạy thuật toán trên đồ thị, ta phải lưu nó trong code. Hai cách chính: ma trận kề và danh sách kề — đánh đổi bộ nhớ và tốc độ ngược nhau. Chọn đúng cách ảnh hưởng lớn tới hiệu năng.
1. Đồ thị ví dụ
(0)───(1)
│ /
│ /
(2)─(3)
Cạnh: 0-1, 0-2, 1-3, 2-3 (vô hướng). Ta sẽ lưu đồ thị này theo hai cách.
2. Cách 1: Ma trận kề (adjacency matrix)
Một lưới V × V: ô [i][j] = 1 nếu có cạnh i–j, ngược lại 0.
0 1 2 3
0 [0, 1, 1, 0]
1 [1, 0, 0, 1]
2 [1, 0, 0, 1]
3 [0, 1, 1, 0]
- Kiểm tra "có cạnh i–j không?":
mt[i][j]→ O(1) ✅ - Bộ nhớ: luôn
V²dù ít cạnh → tốn khi đồ thị thưa. - Duyệt hàng xóm của i: quét cả hàng → O(V).
3. Cách 2: Danh sách kề (adjacency list)
Mỗi đỉnh giữ một danh sách các hàng xóm. Phổ biến nhất trong thực tế.
0 → [1, 2]
1 → [0, 3]
2 → [0, 3]
3 → [1, 2]
- Bộ nhớ:
O(V + E)→ tiết kiệm khi đồ thị thưa (ít cạnh). ✅ - Duyệt hàng xóm của i: đi đúng danh sách của i → nhanh, đúng số hàng xóm.
- Kiểm tra "có cạnh i–j?": duyệt danh sách của i → O(bậc của i).
4. Chạy debug: dựng danh sách kề
Bước qua việc thêm các cạnh vào danh sách kề (đồ thị vô hướng → thêm cả hai chiều):
5. So sánh & chọn cách
| Tiêu chí | Ma trận kề | Danh sách kề |
|---|---|---|
| Bộ nhớ | O(V²) | O(V + E) |
| Kiểm tra cạnh i–j | O(1) | O(bậc i) |
| Duyệt hàng xóm của i | O(V) | O(bậc i) |
| Tốt cho | đồ thị dày (nhiều cạnh) | đồ thị thưa (ít cạnh) |
Quy tắc: đa số đồ thị thực tế thưa (mỗi đỉnh chỉ nối vài đỉnh) → danh sách kề là mặc định. Dùng ma trận kề khi đồ thị dày hoặc cần kiểm tra cạnh i–j liên tục trong O(1).
🎬 Trực quan hóa tương tác — VisuAlgo
Quan sát ma trận kề và danh sách kề cập nhật song song khi thêm/xóa cạnh. Thử chuyển giữa đồ thị có hướng và vô hướng.
Nguồn: visualgo.net — Steven Halim, NUS. Dùng cho lớp học; ảnh chụp/video cần ghi nguồn URL.
6. Code mẫu (chạy thật)
Đang tải trình chạy code…
7. Mẫu nhận diện
- Đồ thị thưa (E nhỏ hơn nhiều V²) hoặc cần duyệt hàng xóm (BFS/DFS) → danh sách kề.
- Cần kiểm tra "có cạnh i–j?" rất nhiều, hoặc đồ thị dày → ma trận kề.
- BFS/DFS (Trụ 3) hầu hết dùng danh sách kề.