玄学事件

并查集有顺序???
今天水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;
}
posted @ 2022-01-27 23:21  fervency  阅读(27)  评论(0编辑  收藏  举报