并查集的模板都能直接套,太简单不注释了,就存个代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int size = 1010; 5 int parent[size]; 6 int cnt[1005]; 7 int t, n, m, x, y, num; 8 9 10 //赋初值 11 void parentkey(int n){ 12 for(int i=1;i<=n;i++){ 13 parent[i] = i; 14 cnt[i] = 0; 15 } 16 } 17 18 //找根节点 19 int find(int x){ 20 return x==parent[x]? x : parent[x]=find(parent[x]); 21 } 22 23 //合并 24 void parent_union(int x,int y){ 25 int fx = find(x); 26 int fy = find(y); 27 parent[fy] = fx; 28 } 29 30 int number(int x){ 31 int num = 0; 32 int fx = find(x); 33 for(int i=0;i<size;i++){ 34 if(fx==find(i)) 35 num++; 36 } 37 return num; 38 } 39 40 int main(){ 41 scanf("%d",&t); 42 while(t--){ 43 scanf("%d %d",&n ,&m); 44 parentkey(n); 45 num = 0; 46 for(int i=0; i<m; i++){ 47 scanf("%d %d",&x, &y); 48 parent_union(x, y); 49 } 50 for(int i=1; i<=n; i++){ 51 cnt[find(i)]++; 52 }for(int i=1; i<=n; i++) 53 if(cnt[i]) 54 num ++; 55 printf("%d ",num); 56 } 57 58 }