连通块
BFS
在BFS解决连通块问题中有提及,不再赘述
并查集
比BFS
解决要快一些
解决思路
- 初始化连通块数量为点数,即每一个点为一个连通块
- 对于每次读入的两个有关联的点,如果不在同一个集合则把一个点加入到另一个点的集合,同时连通块数量减1
代码实现
// 说明:
// 1. n个点 m条边
// 2. 点的编号为1~n
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <unordered_map>
using namespace std;
int n, m; // n:点数; m:边数
int cnt; // 连通块数量
vector<int> p; // 并查集father数组
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
void solve() {
cin >> n >> m;
cnt = n; // 初始连通块数量
p = vector<int>(n);
for (int i = 1; i <= n; ++i) p[i] = i; // 初始化并查集数组
for (int i = 0; i < m; ++i) {
int x, y;
cin >> x >> y;
int px = find(x), py = find(y);
if (px != py) {
p[px] = py;
--cnt;
}
}
cout << cnt << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
solve();
return 0;
}