Skip to content

Đồ thị — Tổng quan

Mạng xã hội, hệ thống định tuyến Internet, bản đồ giao thông, dependency graph trong CI/CD — tất cả đều là đồ thị. Khi bạn gõ một URL, gói tin phải tìm đường qua hàng chục router; khi Kubernetes schedule một Pod, nó phải giải bài toán ràng buộc trên đồ thị phụ thuộc.

Nắm vững lý thuyết đồ thị không chỉ giúp bạn giải bài competitive programming, mà quan trọng hơn là giúp bạn thiết kế hệ thống có khả năng mở rộng và debug hiệu quả khi production gặp sự cố.

Biểu diễn đồ thị

Mọi thuật toán đồ thị bắt đầu từ cách bạn lưu trữ nó trong bộ nhớ. Hai cách phổ biến nhất — mỗi cách có trade-off rõ ràng.

Tiêu chíMa trận kề (Adjacency Matrix)Danh sách kề (Adjacency List)
Cấu trúcMảng 2D A[V][V]. A[i][j] = 1 nếu có cạnh i → jMảng vector adj[V]. adj[i] chứa các đỉnh kề với i
Bộ nhớO(V2) — tốn kém khi đồ thị thưaO(V+E) — tiết kiệm
Kiểm tra cạnh i-jO(1)O(deg(i))
Duyệt đỉnh kề iO(V) — quét cả hàngO(deg(i)) — chỉ duyệt đỉnh kề
Phù hợpĐồ thị dày (EV2), Floyd-WarshallĐồ thị thưa (EV2) — hầu hết production

Quy tắc chọn nhanh

Nếu E<V2/10 → danh sách kề. Nếu cần kiểm tra cạnh O(1) liên tục hoặc V nhỏ (≤ 1000) → ma trận kề.

Lộ trình học

Thứ tự khuyến nghị để xây dựng nền tảng vững chắc, từ duyệt cơ bản đến luồng mạng.

BFS & DFS → Dijkstra → Bellman-Ford → Floyd-Warshall
    ↓                                        ↓
Topological Sort → DSU → MST       LCA · Binary Lifting

                                    Max Flow · Edmonds-Karp

Nội dung

Duyệt đồ thị

  • BFS & DFS — Hai kỹ thuật nền tảng: duyệt theo chiều rộng và chiều sâu

Đường đi ngắn nhất (Shortest Path)

Thuật toánLoạiTrọng số âmĐộ phức tạpKhi nào dùng
DijkstraSingle-sourceO((V+E)logV)GPS, routing, game pathfinding
Bellman-FordSingle-sourceO(V×E)Phát hiện chu trình âm, forex arbitrage
Floyd-WarshallAll-pairsO(V3)Routing table, connectivity matrix

Chọn thuật toán nào?

Bài toánChọn
Trọng số ≥ 0, một nguồnDijkstra
Có cạnh trọng số âmBellman-Ford
Cần khoảng cách mọi cặp đỉnhFloyd-Warshall
Phát hiện chu trình âmBellman-Ford hoặc Floyd-Warshall
Đồ thị thưa, all-pairs, trọng số âmJohnson's (Bellman-Ford + Dijkstra)

Cây khung nhỏ nhất (Minimum Spanning Tree)

  • MST — Prim & Kruskal — Kết nối tất cả đỉnh với chi phí tối thiểu. Ứng dụng: thiết kế mạng, clustering.

Thuật toán cấu trúc

Truy vấn trên cây

  • LCA — Binary Lifting — Lowest Common Ancestor bằng kỹ thuật nhảy lũy thừa 2. Query O(logN) sau tiền xử lý O(NlogN).

Luồng mạng (Network Flow)

🧠 Quiz

Câu 1: Để tìm đường ngắn nhất từ một đỉnh đến TẤT CẢ đỉnh khác trong đồ thị có trọng số dương, dùng thuật toán nào?

  • [ ] A) BFS (Breadth-First Search)
  • [x] B) Dijkstra's Algorithm
  • [ ] C) DFS (Depth-First Search)
  • [ ] D) Kruskal's Algorithm

💡 Giải thích: Dijkstra giải Single-Source Shortest Path cho đồ thị trọng số dương trong O((V+E) log V) với priority queue. BFS chỉ đúng cho đồ thị unweighted. DFS không tìm đường ngắn nhất. Kruskal tìm MST, không phải shortest path.

Câu 2: Topological Sort áp dụng cho loại đồ thị nào?

  • [ ] A) Đồ thị vô hướng có chu trình
  • [ ] B) Đồ thị có trọng số âm
  • [x] C) DAG — Đồ thị có hướng không có chu trình (Directed Acyclic Graph)
  • [ ] D) Bất kỳ đồ thị nào

💡 Giải thích: Topological ordering chỉ tồn tại cho DAG — nếu có chu trình thì không thể sắp xếp sao cho mọi cạnh u→v đều có u đứng trước v. Ứng dụng: build system (Makefile), course prerequisites, task scheduling.

Câu 3: Disjoint Set Union (DSU) hỗ trợ hai thao tác chính nào?

  • [ ] A) Insert và Delete
  • [ ] B) Push và Pop
  • [x] C) Find (tìm đại diện tập hợp) và Union (gộp hai tập hợp)
  • [ ] D) Search và Sort

💡 Giải thích: DSU (Union-Find) có Find O(α(n)) ≈ O(1) (amortized) và Union O(α(n)). Với path compression + union by rank, α(n) là inverse Ackermann — gần như hằng số. Dùng trong Kruskal's MST, connected components, và xử lý equivalence relations.

Từ khóa glossary: đồ thị, graph, adjacency list, adjacency matrix, shortest path, MST, network flow

Tìm kiếm liên quan: thuật toán đồ thị, lý thuyết đồ thị, graph algorithms, duyệt đồ thị