呵呵,基本的并查集,合并之后,判断集合的个数即可
#include<iostream> #include<algorithm> #define maxn 1010 using namespace std; int f[maxn],n,m; void init() { for(int i=0;i<maxn;i++) f[i]=i; } int find(int x) { if(x==f[x]) return x; f[x]=find(f[x]); return f[x]; }//路径压缩 void Union(int x,int y) { int a=find(x); int b=find(y); if(a==b) return ; f[b]=a; }//合并 int main() { int T,a,b; scanf("%d",&T); while(T--) { scanf("%d %d",&n,&m); init(); for(int i=0;i<m;i++) { scanf("%d %d",&a,&b); Union(a,b); } int count=0; for(int i=1;i<=n;i++) { int t=find(i); if(t==i) count++; } printf("%d\n",count); } return 0; }