HDU 1856 More is better

来源:互联网 发布:网络银行是什么 编辑:程序博客网 时间:2024/06/05 02:57

题目大意:

在一群人里挑选一些人,这些必须都是朋友关系,关系可以是直接的也可以是间接的。


解题思路:

非常简单明了的一道并查集,但是不是求一共有几个集合,而是求每个集合中的元素个数,进而求出最大值,只需要在合并两个集合时处理一下,让这两个集合的元素个数也合并一下就行了。接下来只需要找出最大值即可。要注意的一个地方就是:当n=0时,要输出1。


#include<cstdio>#include<cstring>#include<cmath>#define LL long long#define db double#define maxn 10000000#define max(a,b) ((a>b)?(a):(b))#define min(a,b) ((a<b)?(a):(b))int f[maxn],num[maxn];void frst(){for (int i=0;i<=maxn;i++){f[i]=i;num[i]=1;}}int get(int x){if (f[x]!=x) f[x]=get(f[x]);return f[x];}void merge(int a,int b){int p=get(a); int q=get(b);if (p!=q) {f[p]=q;num[q]+=num[p];}}int main(){int n,a,b,i,sum,maxx;while(~scanf("%d",&n)){if (n==0) {printf("1\n");continue;}maxx=0;frst();for (int i=1;i<=n;i++){scanf("%d%d",&a,&b);if (a>maxx) maxx=a;if (b>maxx) maxx=b;merge(a,b);}int Max=0;for (int i=1;i<=maxx;i++)if (num[i]>Max) Max=num[i];printf("%d\n",Max);}return 0;}


0 0