和基本的并查集相比,就是稍微改动了一下。
要求的是每个集合里面人数最多的人数。
就多用一个数组记录这个人数即可。
#include<stdio.h> #define N 10000000 int father[N],num[N]; void initial() { int i; for(i=1;i<=N;i++) { father[i]=i; num[i]=1; } } int find(int x) { if(father[x]!=x) father[x]=find(father[x]); return father[x]; } void merge(int a,int b){ int p=find(a); int q=find(b); if(p!=q) { father[p]=q; num[q]+=num[p]; } } int main() { int n,a,b,i,sum,max; while(~scanf("%d",&n)){ if(n==0){ printf("1\n"); continue; } max=0; initial(); for(i=0;i<n;i++) { scanf("%d%d",&a,&b); if(a>max) max=a; if(b>max) max=b; merge(a,b); } int MAX=0; for(int i=1;i<=max;i++) if(num[i]>MAX) MAX=num[i]; printf("%d\n",MAX); } }
时间: 2024-10-23 09:47:29