简单的两个函数的并查集即可,不用做路径压缩。
#include <iostream>
using namespace std;
int root[1000001];
//初始化 刚开始每株植物的根都是自己的根
void init(int n) {
for (int i=1; i<=n; i++) {
root[i] = i;
}
}
int find(int x) {
int index = x;
while (root[index] != index) {
index = root[index];
}
return index;
}
//合并
//将a和b的根合并的方法就是找到a当前的根和b当前的根 然后把一个的根并到另一个上面去
void merge(int a, int b) {
int x = find(a);
int y = find(b);
if (x != y) {
root[x] = root[y];
}
}
int count(int n) {
int sum = 0;
for (int i=1; i<=n; i++) {
if (root[i] == i) {
sum ++;
}
}
return sum;
}
int main(int argc, const char * argv[]) {
// insert code here...
int n, m, k;
cin >> m >> n;
init(m*n);
cin >> k;
int a, b;
for (int i=0; i<k; i++) {
cin >> a >> b;
merge(a, b);
}
cout << count(m*n) << endl;
return 0;
}