题意
n个点,m条边,无向图,求最后形成的集合有多少个。
解法
基础的并查集
传送门
http://acm.hdu.edu.cn/showproblem.php?pid=1213
Code
#include <cstdio>
#include <iostream>
using namespace std ;
class UnionFind {
private :
int * fa;
int size;
public :
UnionFind(int n) {
size = n;
fa = new int [n+1 ];
for (int i = 1 ; i <= size ; i ++) {
fa[i] = i;
}
}
~UnionFind() {
delete [] fa;
}
int Find(int x) {
if (fa[x] != x) {
fa[x] = Find(fa[x]);
}
return fa[x];
}
void Union(int x,int y) {
int fx = Find(x);
int fy = Find(y);
if (fx != fy) {
fa[fx] = fy;
}
}
int GetCount() {
int count = 0 ;
for (int i = 1 ; i <= size ; i ++) {
if (fa[i] == i) {
count ++;
}
}
return count;
}
};
int main() {
int caseNum;
scanf ("%d" ,&caseNum);
while (caseNum--) {
int n , m ;
scanf ("%d %d" ,&n,&m);
UnionFind uf(n);
for (int i = 1 ; i <= m ; i ++) {
int u , v;
scanf ("%d %d" ,&u,&v);
uf.Union(u,v);
}
int ans = uf.GetCount();
printf ("%d\n" ,ans);
}
return 0 ;
}