link : https://marisaoj.com/problem/115
Xét lần lượt các đỉnh từ $1$ đến $n$, với mỗi đỉnh $i$ chưa được thăm, thực hiện DFS từ đỉnh $i$ để tìm các đỉnh cùng thành phần liên thông với đỉnh $i$. Số lần thực hiện DFS chính là số thành phần liên thông của đồ thị.
:::spoiler Code mẫu (c++)
```cpp
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 1;
int n, m;
vector<int> e[maxn];
bool vis[maxn];
void dfs(int r) {
stack<int> s;
s.push(r);
while (s.size()) {
int u = s.top(); s.pop();
if (vis[u]) continue;
else vis[u] = true;
for (int &v : e[u]) if (!vis[v]) {
s.push(v);
}
}
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr);
cin >> n >> m;
for (int u, v, i = 0; i < m; ++i) {
cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
}
int ans = 0;
for (int i = 1; i <= n; ++i) if (!vis[i]) {
++ans;
dfs(i);
}
cout << ans;
return 0;
}
```
:::