基本操作就相当于一个班级里面 看看一个几个人是好朋友 一共有几组
代码 模板
#include<iostream>
#include<string>
using namespace std;
int father[110];
bool isroot[110];
int n,m;
int sea(int x){
int vis=x;
while(x!=father[x]){
x=father[x];
}
while(vis!=father[vis]){ //路径压缩 减少复杂度
int z=vis;
vis=father[vis];
father[z]=x;
}
return x;
}
void union1(int a,int b){//链接函数
int fa=father[a];
int fb=father[b];
if(fa!=fb){
father[fa]=fb;
}
}
void csh(int n){//初始化操作
for(int i=1;i<=n;i++){
father[i]=i;
isroot[i]=false;
}
}
int main(){
int a,b;
cin>>n>>m; //n相当于1-n人的编号 m相当于接下来的几组数据
csh(n);
for(int i=0;i<m;i++){
cin>>a>>b;//表明 a与b是好朋友
union1(a,b);//将a与b集合
}
for(int i=1;i<=n;i++){
isroot[sea(i)]=true;
}
int ans=0;
for(int i=1;i<=n;i++){
if(isroot[i]==true){
ans++;//查找有几个父亲节点 ans++;
}
}
cout<<ans;
return 0;
}
如果想知道每组有几个人 那就 将bool类型的isroot数组 改为int 中间经过稍微改动就好了