#include using namespace std;
const long long INF = 1000000000;
const int MAX_N = 1000;
class disjointSet {
public:
int parent[MAX_N];
disjointSet() {
for (int i = 0; i < MAX_N; ++i) {
parent[i] = i;
}
}
int find(int x) {
if (parent[x] == x) {
return x;
} else {
return parent[x] = find(parent[x]);
}
}
bool unite(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX == rootY) {
return false;
}
parent[rootY] = rootX;
return true;
}
bool same(int x, int y) {
return find(x) == find(y);
}
};
int disjointSetMain()
{
int x, y, n, m;
while (~scanf("%d", &n) && n != 0) {
scanf("%d", &m);
disjointSet parent = disjointSet();
for (int i = 1; i <= m; ++i) {
scanf("%d%d", &x, &y);
parent.unite(x, y);
}
int count = 0;
for (int i = 1; i <= n; ++i) {
if (parent.parent[i] == i) {
count ++;
}
}
printf("%d\n", count - 1);
}
}
int main()
{
disjointSetMain();
}
```
--------------
今天大年初一,祝各位新年快乐!
参考:
1. 《算法笔记》
2. [畅通工程-题解(C++代码)并查集](https://blog.dotcpp.com/a/60998)