HDU 1856 More is better 基础并查集★(经典)

来源:互联网 发布:达观数据 融资 编辑:程序博客网 时间:2024/06/07 18:23

一个并查集 计算每个集合的元素 找出元素最多的那个集合,输出元素的个数

输入n=0时也应该输出1

分析:在合并的时候,把集合的个数也合并,然后找出集合个数最大的。

#include<iostream>#include<algorithm>#include<queue>#include<vector>#include<string>#include<cstring>#include<cstdio>const int maxn=100100;const int INF=0x3f3f3f3f;typedef long long LL;using namespace std;int par[maxn];int num[maxn]; //记录集合个数 void init(){for(int i=0;i<maxn;i++) {par[i]=i;num[i]=1; //集合个数初始化为1 }}int find(int a){return par[a]==a?a:par[a]=find(par[a]);}void unit(int a,int b){int p1=find(a);int p2=find(b);if(p1!=p2) {par[p2]=p1;num[p1]+=num[p2]; //合并集合中的个数 }}bool same(int a,int b){return (find(a)==find(b))?true:false; }int main(){//freopen("E:\\ACM\\test.txt","r",stdin);int a,b;int N;while(~scanf("%d",&N)){init();for(int i=0;i<N;i++){scanf("%d%d",&a,&b);unit(a,b);}int ans=0;        for(int i=0;i<=N;i++)ans=max(ans,num[i]);printf("%d\n",ans);  }return 0;}