玄学事件
并查集有顺序???
今天水T4的时候一开始正常读入,到手40pts,然后怎么调都不行。。。然后手滑输错样例6 3 1 2 3 1 4 5
,结果就对了
再然后我就意识到了一些问题。加上一句swap(u[i],v[i]);
就过了。。。
点击查看代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int f[100010],n,m,k,ans;
int find(int x)
{
if(f[x]==x) return x;
return f[x]=find(f[x]);
}
int main(){
scanf("%d%d",&n,&m);
int u[100010],v[100010];
for(int i=1;i<=n;i++){
f[i]=i;
}
for(int i=1;i<=m;i++){
scanf("%d%d",&u[i],&v[i]);
swap(u[i],v[i]);
f[find(u[i])]=find(v[i]);
}
int fa[100010];
for(int i=1;i<=n;i++)
{
if(f[i]==i)
{
ans++;//家庭数
fa[ans]=i;
}
}
// printf("%d %d\n",f[1],f[2]);
int num[100010];
for(int i=1;i<=n;i++)//进
{
for(int j=1;j<=ans;j++)//在第j个家庭里吗
{
if(fa[j]==f[i])
{
num[j]++;
// printf("%d",i);
}
}
}
int maxx=-1;
for(int i=1;i<=ans;i++)
{
maxx=max(num[i],maxx);
}
printf("%d %d",ans,maxx);
return 0;
}