【基于map的并查集】
题目中给出的结点是离散的,因此不能用数组
需要用map<int,int>来映射
#include<iostream>
#include<map>
using namespace std;
map<int,int> parent;
int getRoot(int i){
if(parent.find(i)==parent.end()) parent[i] = i;
while(parent[i]!=i){
i = parent[i];
}
return i;
}
void unionTree(int a,int b){
int root_a = getRoot(a);
int root_b = getRoot(b);
parent[root_a] = root_b;
}
int main(){
int a,b;
while(cin>>a>>b){
unionTree(a,b);
}
int counter = 0;
map<int,int>::iterator it = parent.begin();
while(it!=parent.end()){
if(it->second==it->first) counter++;
it++;
}
cout<<counter<<endl;
return 0;
}

京公网安备 11010502036488号