并查集的运用
#include<iostream> #include<cstring> #include<algorithm> #include<map> using namespace std ; const int N = 1e6 + 10 ; int p[N] ;//i的父节点,用到了路径压缩,所以记录的是祖宗节点 int find(int x){//这里路径压缩 if(p[x] != x) p[x] = find(p[x]) ;//找x的祖宗节点,如果x不是祖宗节点 ,那就找x的父节点的父节点 return p[x] ; } map<int,bool> mp ; int main(){ int m , n ; cin >> m >> n ; int k ; cin >> k ; for(int i = 1 ; i <= m * n ; i ++) p[i] = i ; for(int i = 0 ; i < k ; i ++){ int a, b ; cin >> a >> b ; p[find(a)] = find(b) ; } // for(int i = 1 ; i <= m*n ; i ++){ // int q = find(i) ; // } int ans = 0 ; // for(int i = 1 ; i <= m*n ; i ++){//这是用根节点的数量也就是祖宗节点的数量计算合根植物的最终数量 // if(i==find(i)) ans++ ; // } for(int i = 1 ; i <= n*m ; i ++){//这是用map来判重一波 int a = find(i) ; if(!mp[a]){ mp[a] = true ; ans ++ ; } } cout << ans << endl ; return 0 ; }