这题解法大家看个乐子就好,并查集咱也不搞路径压缩了,随便并,只要并到一起就行,结点个数不知道那就初始化一个超大的节点数量,能ac就行

#include <cstdio>
using namespace std;
#define N 1000001

int father[N];
int hash[N]; // 标识出现过的结点编号

void init(int n) {
    for (int i = 0; i < N; i++) {
        father[i] = i;
        hash[i] = 0;
    }
}

int Find(int x) {
    if (x != father[x]) {
        return Find(father[x]);
    }
    return father[x];
}

void Union(int m, int n) {
    int x = Find(m);
    int y = Find(n);
    father[x] = y; // 把x并到y下面
}

int main() {
    int m, n;
    init(N);
    while (scanf("%d%d", &m, &n) != EOF) {
        Union(m, n);
        hash[m]++;
        hash[n]++;
    }
    int ans = 0;
    // 若有结点它的根是自己,说明是一个集合的根
    for (int i = 0; i < N; i++) {
        if (hash[i] && father[i] == i) {
            ans++;
        }
    }
    printf("%d\n", ans);
    return 0;
}