输入一些整数,给出若干个一对的信息,将其分为几组,返回组的数量

思路

  1. 先写初始化函数,每个结点的爸爸都是自己
  2. 写合并函数,如果结点的根不同就合并
  3. 写归一化根结点函数,将同一个组的结点父亲全部统一
  4. 用isRoot数组计算组数
  5. 最后直接加bool变量就行

PS:如果需要统计每组人数,将isRoot改成int型即可

代码

  1. #include<algorithm>
  2. #include<vector>
  3. #include<iostream>
  4. using namespace std;
  5. const int maxn = 110;
  6. int m, n;
  7. int father[maxn];
  8. int isRoot[maxn];
  9. int find_father(int i){
  10. if(father[i] == i) return i;
  11. else{
  12. int f = find_father(father[i]);
  13. father[i] = f;
  14. return f;
  15. }
  16. }
  17. void Union(int a, int b){
  18. int faA = find_father(a);
  19. int faB = find_father(b);
  20. if(faA!=faB) father[faA] = faB;
  21. }
  22. int main(){
  23. scanf("%d%d", &n, &m);
  24. int node1, node2;
  25. for(int i = 1; i <= n; i++) {
  26. father[i] = i;// 一开始自己都是自己的爸爸
  27. isRoot[i] = false;
  28. }
  29. for(int i = 0; i < m; i++){
  30. scanf("%d%d", &node1, &node2);
  31. Union(node1, node2);
  32. }
  33. //初始化根结点
  34. for(int i = 1; i <= n; i++){
  35. isRoot[find_father(i)] = true;
  36. }
  37. int count = 0;
  38. for(int i = 1; i <= n; i++){
  39. count += isRoot[i];
  40. }
  41. printf("%d",count);
  42. return 0;
  43. }