马上要比赛了……
构建并查集,输出最大的集合的元素个数即可
普通并查集并没有保存元素个数
只需要在合并的时候将元素个数保存在根节点即可。这里开了一个w数组
另外题目给的是102400 K,并不害怕爆内存233
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<sstream>
#include<stack>
#include<queue>
#include<fstream>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#define CLR(x) memset(x,0,sizeof(x))
#define ll long long
#define eps 1e-6
using namespace std;
int pre[11111111];
int w[11111111];
int result;
int sfind(int a) //带路径压缩的版本
{
if (a!=pre[a])
pre[a]=sfind(pre[a]);
return pre[a];
}
void smix(int a,int b)
{
int sa(sfind(a)),sb(sfind(b));
if (sa==sb) //普通并查集中这句话可有可无,但是这题中需要对w数组操作,因此必须有
return;
pre[sb]=sa;
w[sa]+=w[sb];
result=max(result,w[sa]);
}
int main()
{
cin.sync_with_stdio(false);
//fstream T("test.txt");
//cin.rdbuf(T.rdbuf());
int n;
while (cin>>n)
{
for (int i=0;i<=10001111;i++)
{
pre[i]=i;
w[i]=1;
}
result=1; //1个学生是最小的情况,不是0
int a,b;
for (int i=0;i<n;i++)
{
cin>>a>>b;
smix(a,b);
}
cout<<result<<endl;
}
return 0;
}