王道机试练习——找朋友之求最大集合

本文探讨了使用并查集算法解决寻找最大朋友圈的问题。在1000万小朋友中,通过并查集找到最大的相互为朋友的集合,介绍了如何在合并过程中更新集合大小,以确定最终的最大集合人数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

王道机试练习——找朋友之求最大集合

题目描述

有 10000000 个小朋友,他们之中有 N 对好朋友,且朋友关系具 有传递性:若 A 与 B 是朋友, B 与 C 是朋友,那么我们也认为 A 与 C 是朋友。 在给出这 N 对朋友关系后,要求我们找出一个最大(人数最多)的集合,该集 合中任意两人之间都是朋友或者该集合中只有一个人,输出该最大人数。 如前例所示,我们利用并查集相关操作已经可以求得有几个这样符合条件的 集合,但是计算集合中的元素个数我们仍没有涉及。我们如果能够成功求得每个 集合的元素个数,我们只需要选择包含元素最多的集合,并输出该集合中的元素 个数即可。 为了计算每个集合的元素个数,我们不妨在表示每个集合的树的根结点记录 该集合所包含的元素个数,在合并时累加被合并两个集合包含的元素个数。最后, 找出所有集合中所包含元素最多的集合即是所求。

代码

#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
#define N 10000001
int Tree[N];
int findRoot(int x) {
	if (Tree[x] == -1) return x;
	else {
		int tmp = findRoot(Tree[x]);
		Tree[x] = tmp;
		return tmp;
	}
}
int sum[N];
int main() {
	int n;
	while (scanf("%d", &n) != EOF) {
		for (int i = 1; i <= N; i++) {
			Tree[i] = -1;
			sum[i] = 1;
		}
		while (n--) {
			int a, b;
			scanf("%d%d", &a, &b);
			a = findRoot(a);
			b = findRoot(b);
			if (a != b) {
				Tree[a] = b;
				sum[b] += sum[a];
			}
		}
		int ans = 1;
		for (int i = 1; i <= N; i++) {
			if (sum[i] > ans) ans = sum[i];
		}
		printf("%d\n", ans);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值