Thuật toán đồ thị
DFS —
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 —
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 —
Đườ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 —
Đườ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 —
Đường đi ngắn nhất mọi cặp đỉnh, .
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,
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 | 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 |