输入:数码宝贝个数n和好朋友组数m
接下来有m行,每行两个正整数a,b:表明a和b是好朋友
输出:好朋友的组数
思路:对同一个集合来说只有一个根节点,所以开一个bool型数组flag[N]来记录每个结点是否作为某个集合的根结点
#include<cstdio> #include<cmath> #include<cstring> #include<iostream> #include<cstdlib> #include<algorithm> #include<string> #include<stack> #include<queue> #include<map> #define MAX 110 using namespace std; int father[MAX]; bool isRoot[MAX]; int n,m; int findFather(int x){ int a=x; while(x!=father[x]){ x=father[x]; } while(a!=father[a]){ int temp=a; a=father[a]; father[temp]=x; } return x; } void Union(int a,int b){ int fa=findFather(a); int fb=findFather(b); if(fa!=fb){ father[fa]=fb; } } void init(int n){ for(int i=1;i<=n;i++){ father[i]=i; isRoot[i]=false; } } int main(){ scanf("%d%d",&n,&m); int a,b; init(n); for(int i=0;i<m;i++){ scanf("%d%d",&a,&b); Union(a,b); } for(int i=1;i<=n;i++){ isRoot[father[i]]=true; } int ans=0; for(int i=1;i<=n;i++){ ans+=isRoot[i]; } printf("%d\n",ans); return 0; }