并查集的最大集合:就是指输入所有关系后,分成了很多的不同集合,最大集合就是那些不同的集合种包含元素最多的集合所包含的元素的多少。
集合个数:就是指输入所有关系后,这些不同集合有多少个。
解决思路:
就是在普通的并查集模板中加入一个记录数组num[],这个数组可以标记每个元素的权值的最大和和最大集合的元素个数。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define INF 0x3f3f3f3f
#define ONF 0xc0c0c0c0
using namespace std;
typedef long long ll;
int par[10000005],num[10000005];
void init(int n)
{
for(int i=1;i<=n;i++)
{
par[i]=i;
num[i]=1;//这里是求最大集合的个数,如果求最后集合中权值最大为多少就让num数组初始化为最开始各个元素的权值。
}
}
int get_par(int x)
{
return par[x]==x?x:par[x]=get_par(par[x]);
}
void doit(int x,int y)
{
int dx=get_par(x);
int dy=get_par(y);
if(dx!=dy)
{
par[dx]=dy;
num[dy]=num[dx]+num[dy];
}
}
int main()
{
in