王道机试指南NO.13并查集&memset的特殊注意点

版权声明:本博全为博主学习日常,均为原创,请勿转载 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;
} 

运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44332298/article/details/88079339