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

Thuật toán đồ thị

huunguyen huunguyen Updated Tháng sáu 2, 2026

DFS — O(V+E)

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);
}

BFS — O(V+E)

Tìm đường ngắn nhất trên đồ thị không trọng số.

vector<int> bfs(int src, vector<vector<int>>& adj) {
    vector<int> dist(adj.size(), -1);
    queue<int> q;
    dist[src] = 0; q.push(src);
    while (!q.empty()) {
        int u = q.front(); q.pop();
        for (int v : adj[u]) if (dist[v]==-1) { dist[v]=dist[u]+1; q.push(v); }
    }
    return dist;
}

Dijkstra — O((V+E)logV)

Đường đi ngắn nhất, trọng số không âm.

vector<long long> dijkstra(int src, vector<vector<pair<int,int>>>& adj) {
    vector<long long> dist(adj.size(), LLONG_MAX);
    priority_queue<pair<long long,int>,vector<pair<long long,int>>,greater<>> pq;
    dist[src]=0; pq.push({0,src});
    while (!pq.empty()) {
        auto [d,u]=pq.top(); pq.pop();
        if (d>dist[u]) continue;
        for (auto [w,v]:adj[u]) if (dist[u]+w<dist[v]) { dist[v]=dist[u]+w; pq.push({dist[v],v}); }
    }
    return dist;
}

Bellman-Ford — O(VE)

Đường đi ngắn nhất, cho phép trọng số âm.

vector<long long> dist(n, LLONG_MAX);
dist[src] = 0;
for (int i = 0; i < n-1; i++)
    for (auto [u,v,w] : edges)
        if (dist[u]!=LLONG_MAX && dist[u]+w<dist[v]) dist[v]=dist[u]+w;

Floyd-Warshall — O(V3)

Đường đi ngắn nhất mọi cặp đỉnh, V500.

for (int k=0; k<n; k++)
    for (int i=0; i<n; i++)
        for (int j=0; j<n; j++)
            dist[i][j] = min(dist[i][j], dist[i][k]+dist[k][j]);

Kruskal — MST, O(ElogE)

sort(edges.begin(), edges.end());
DSU dsu(n);
long long cost = 0;
for (auto [w,u,v] : edges) if (dsu.unite(u,v)) cost += w;

Sắp xếp topo (Kahn's algorithm)

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);
}

Chủ đề nâng cao — trang chi tiết

Trang này là cheatsheet các thuật toán đồ thị nền tảng. Các kỹ thuật nâng cao có trang riêng:

Chủ đề Mô tả Trang
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
Bridge & 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
gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0