题目
在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属于同一个部落。
思路
本题应该说是典型的并查集的题目,用并查集很容易解决。
代码
#include<stdio.h>
#include<stdlib.h>
#define N 100
int find(int x);
void unio(int x,int y);
int n,m,k;
int fa[N],data[N][N];
void main(){
int i,j,k1,k2;
//初始化fa[]
for(i=0;i<N;i++)
fa[i]=i;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&m);
for(j=0;j<m;j++){
scanf("%d",&data[i][j]);
}
for(j=1;j<m;j++)
unio(data[i][0],data[i][j]);
}
scanf("%d",&k);
for(i=0;i<k;i++){
scanf("%d %d",&k1,&k2);
if(find(k1)==find(k2))
printf("Y\n");
else
printf("N\n");
}
system("pause");
}
//并查集
int find(int x){
return x==fa[x]?x:(fa[x]=find(fa[x]));
}
void unio(int x,int y){
fa[find(x)]=find(y);
}