Wiki › Thuật toán › Thuật toán đồ thị

Thuật toán đồ thị

huunguyen huunguyen Updated Tháng 9. 29, 2026 Đọc 3 phút 3 lượt xem

Trang này là điểm xuất phát cho nhóm thuật toán đồ thị: hai phép duyệt nền tảng (DFS, sắp xếp topo) được tóm tắt ngay bên dưới, còn mỗi thuật toán lớn có trang riêng với trực giác, ví dụ chạy tay, lỗi thường gặp và bài tập (kể cả đề VOI).

Lộ trình học gợi ý

  1. Duyệt đồ thị: DFS (bên dưới), rồi BFS cho đường đi ngắn nhất không trọng số, BFS trên lưới và trên không gian trạng thái.
  2. Đường đi ngắn nhất có trọng số: 0-1 BFS khi cạnh chỉ 0/1, Dijkstra khi trọng số không âm, Bellman-Ford và Floyd-Warshall khi có cạnh âm hoặc cần mọi cặp đỉnh.
  3. Cây khung và liên thông: Cây khung nhỏ nhất (MST), Bridge và Articulation Point, SCC.
  4. Cấu trúc đặc biệt và nâng cao: Đồ thị hàm, Đường đi Euler, 2-SAT.

Các trang trong nhóm

Chủ đề Mô tả Trang
BFS Đường đi ngắn nhất không trọng số, BFS lưới, đa nguồn, trên không gian trạng thái BFS
0-1 BFS Đường đi ngắn nhất khi cạnh chỉ có trọng số 0/1, dùng deque trong O(V+E) 0-1 BFS
Dijkstra Đường đi ngắn nhất với trọng số không âm, Dijkstra trên đồ thị trạng thái Dijkstra
Bellman-Ford, Floyd-Warshall Cạnh âm, chu trình âm, đường đi ngắn nhất mọi cặp đỉnh Bellman-Ford và Floyd-Warshall
Cây khung nhỏ nhất Kruskal, Prim, tính chất lát cắt và chu trình, cây khung lớn nhất Cây khung nhỏ nhất (MST)
Đồ thị hàm Mỗi đỉnh một cạnh ra: tìm chu trình, đi k bước, tua nhanh mô phỏng Đồ thị hàm
Bridge và Articulation Point Tìm cầu và đỉnh khớp bằng DFS low-link, phân rã song liên thông Bridge và Articulation Point
Đường đi Euler Đường đi/chu trình qua mọi cạnh đúng một lần (Hierholzer) Đường đi Euler
SCC Thành phần liên thông mạnh (Tarjan/Kosaraju), nén đồ thị thành DAG Strongly Connected Components
2-SAT Thỏa mãn ràng buộc 2 biến qua đồ thị kéo theo + SCC 2-SAT

Liên quan: Biểu diễn đồ thị, DSU, DSU có hoàn tác, DP trên đồ thị, Luồng mạng.

DFS: O(V+E)

Đi sâu hết mức theo một nhánh rồi quay lui. Dùng để đếm thành phần liên thông, kiểm tra chu trình, tính kích thước cây con, và là nền của cầu/khớp, SCC.

vector<bool> visited(n, false);
void dfs(int u, vector<vector<int>>& adj) {
    visited[u] = true;
    for (int v : adj[u]) if (!visited[v]) dfs(v, adj);
}

Với V tới 105 trở lên trên đồ thị dạng đường thẳng, đệ quy có thể tràn stack: chuyển sang DFS bằng stack tường minh.

Sắp xếp topo (thuật toán Kahn): O(V+E)

Xếp các đỉnh của DAG sao cho mọi cạnh u→v có u đứng trước v. Nếu cuối cùng order có ít hơn n đỉnh thì đồ thị có chu trình.

vector<int> indegree(n, 0);
for (int u=0; u<n; u++) for (int v:adj[u]) indegree[v]++;
queue<int> q;
for (int i=0; i<n; i++) if (!indegree[i]) q.push(i);
vector<int> order;
while (!q.empty()) {
    int u=q.front(); q.pop(); order.push_back(u);
    for (int v:adj[u]) if (!--indegree[v]) q.push(v);
}
Trang này có hữu ích không? Đăng nhập để trả lời

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0