版权声明:本博全为博主学习日常,均为原创,请勿转载 https://blog.csdn.net/weixin_44332298/article/details/88079339
题目要求
有10000000个小朋友,他们之中有N对好朋友,且朋友关系具有传递性:若A和B是朋友,B和C是朋友,则认为A和C也是朋友。在给出N对朋友关系后,找出一个最大(人数最多)的集合,该集合中任意两人之间都是朋友或者该集合中只有一个人,输出该最大人数。
样例输入
4
1 2
3 4
5 6
1 6
4
1 2
3 4
5 6
7 8
样例输出
4
2
题目分析
刚开始我用的memset初始化sum和Tree两个int数组,输出的结果是一个巨长的数,百度之后才发现,memset函数按字节对内存块进行初始化,所以不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。
代码
#include <iostream>
#include <string.h>
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]; //用sum[i]表示以i为根的树的节点个数,数据仅当Tree[i]为-1有效
int main(){
int n;
while(cin >> n){
for(int i = 1; i < N; i++){
Tree[i] = -1;
sum[i] = 1;
}
//memset(Tree, -1, sizeof(Tree));
//memset(sum, 1, sizeof(sum)); memset不能将int数组初始化为除0和-1之外的值
while(n-- != 0){
int a, b;
cin >> 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(Tree[i] == -1 && sum[i] > ans){
ans = sum[i];
}
}
cout << ans << endl;
}
return 0;
}