chain[i]数组为i所在集合
li[i]表示i所在集合的人数
chain=new int[10000001];
li=new int[10000001];
for(int i=1;i<10000001;i++){
chain[i]=i;
li[i]=1;
}
ans为集合最大人数,赋值为1(为0会出错)
对于a,b先找到其所在集合
如果不相等
将a划入b集合,再把a所在集合的人数划入b集合
b所在集合人数与ans比较,取最大
int ans=1;
for(int z=0;z<n;z++)
{
scanf("%d%d",&a,&b);
int x=fchain(a),y=fchain(b);
if(x!=y)
{
chan(a,y);
chain[x]=y;
li[y]+=li[x];
li[x]=0;
if(li[y]>ans)ans=li[y];
}
}
完整代码
#include<bits/stdc++.h>
using namespace std;
int *chain;
int *li;
int a,b;
int fchain(int x)
{
int t=x;
while (t!=chain[t])
{
t=chain[t];
}
return t;
}
void chan(int a,int x)
{
int t=a,j;
while (t!=chain[t])
{
j=chain[t];
chain[t]=x;
t=j;
}
}
int main()
{
//freopen("C:\\Users\\Lenovo\\Desktop\\input.txt","r",stdin);
int n;
while (~scanf("%d",&n))
{
chain=new int[10000001];
li=new int[10000001];
for(int i=1;i<10000001;i++){
chain[i]=i;
li[i]=1;
}
int ans=1;
for(int z=0;z<n;z++)
{
scanf("%d%d",&a,&b);
int x=fchain(a),y=fchain(b);
if(x!=y)
{
chan(a,y);//没有这一步会超时
chain[x]=y;
li[y]+=li[x];
li[x]=0;
if(li[y]>ans)ans=li[y];
}
}
printf("%d\n",ans);
free(chain);free(li);
}
return 0;
}