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

京公网安备 11010502036488号