0
点赞
收藏
分享

微信扫一扫

基础实验4-2.8 部落

思考的鸿毛 2022-03-12 阅读 37

题目

在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属于同一个部落。

思路

本题应该说是典型的并查集的题目,用并查集很容易解决。

代码

#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);
}
举报

相关推荐

0 条评论