关键在于fiindRoot()函数
findRoot()函数采用递归方法定义比较简单
int findRoot(int a){
if(fac[a]==-1) return a;
else{
int f = findRoot(fac[a]);
fac[a] = f;//此处是为了完成路径压缩
return f;
}
例题:找朋友。
A和B是朋友,B和C是朋友,则A和C是朋友
输入n,m。
n个节点,m个好朋友
求朋友圈的个数。
本题即为求根节点个数。
#include<bits/stdc++.h>
using namespace std;
#define maxn 105
int fac[maxn];
int findRoot(int a){
if(fac[a]==-1) return a;
else{
int f = findRoot(fac[a]);
fac[a] = f;
return f;
}
}
int main(){
int n,m,a,b;
scanf("%d %d",&n,&m);
memset(fac,-1,sizeof(fac));
while(m--){
scanf("%d %d",&a,&b);
int u = findRoot(a);
int v = findRoot(b);
if(u!=v) fac[u] = v;//合并
}
int cnt = 0;
for(int i=1;i<=n;i++){
if(fac[i]==-1) cnt++;
}
printf("%d\n",cnt);
return 0;
}