并查集的简单板子 属实没想到要申请1百万个
#include<iostream>
using namespace std;
#define N 1000010
int father[N];
bool visit[N];
int Find(int x) {
if (father[x] != x) {
father[x] = Find(father[x]);
}
return father[x];
}
void Union(int x, int y,int & num) {
x = Find(x);
y = Find(y);
if (x != y) {
num++;
father[y] = x; //直接相连
}
}
int main() {
int n, m;
for (int i = 0; i < N; i++) { //并查集初始化
father[i] = i;
visit[i] = false;
}
int num = 0; //记录已经连接节点的个数
while (cin >> n >> m) {
visit[n] = true;
visit[m] = true;
Union(n, m, num);
}
int count = 0;
for (int i = 0; i < N; i++) {
if (visit[i] == true) {
count++;
}
}
cout << count - num << endl;
}