一般并查集father都用数组,但在结点总数不知道,结点编号不连续的情况下不适用,可以用map
#include <cstdio>
#include <unordered_map>
using namespace std;
unordered_map<int, int> father;
int findFather(int v);
void unionSet(int i, int j);
int main(){
int i, j;
while(scanf("%d%d", &i, &j)!=EOF){
unionSet(i, j);
}
int ans = 0;
for(auto it=father.begin(); it!=father.end(); it++){
if(it->first == it->second) ans++;
}
printf("%d", ans);
return 0;
}
int findFather(int v){
if(father.count(v)>0){
int x = v;
while(v != father[v]) v = father[v];
while(x != v){
int temp = father[x];
father[x] = v;
x = temp;
}
}
else father[v] = v; //initialize a new node
return v;
}
void unionSet(int i, int j){
int fi = findFather(i), fj = findFather(j);
if(fi != fj) father[fj] = fi;
return;
}