已过 但有疑惑
查看原帖
已过 但有疑惑
250699
mot1ve楼主2021/3/1 21:51

为什么初始化并查集数组的时候,i<=cnt,而i<=n答案就会出错呢。后面也用不到i>cnt的情况啊。

//注意到fa数组会炸空间,但n不会炸,所以先离散化
#include<bits/stdc++.h>
using namespace std;
int T,n,tot;
struct node{
	int x,y,op;
}a[1000010];
int b[1000010],fa[1000010];
int find(int x)
{
	if(x==fa[x]) return x;
	return fa[x]=find(fa[x]);
}
bool cmp(node a,node b)
{
	return a.op>b.op;
}
int main()
{
	cin>>T;
	while(T--)
	{
		memset(b,0,sizeof(b));
		memset(fa,0,sizeof(fa));
		memset(a,0,sizeof(a)); 
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].op);
			b[++tot]=a[i].x;
			b[++tot]=a[i].y;
		}
		sort(b+1,b+1+tot);
		int cnt=unique(b+1,b+1+tot)-b-1;
		for(int i=1;i<=n;i++)
		{
			a[i].x=lower_bound(b+1,b+1+cnt,a[i].x)-b;
			a[i].y=lower_bound(b+1,b+1+cnt,a[i].y)-b;
		}
		sort(a+1,a+1+n,cmp);
		for(int i=1;i<=cnt;i++)
		{
			fa[i]=i;
		}
		bool ok;
		for(int i=1;i<=n;i++)
		{
			ok=1;
			if(a[i].op==1)
			{
				int f1=find(a[i].x),f2=find(a[i].y);
				if(f1!=f2)
				{
					fa[f1]=f2;
				}
			}
			else
			{
				int f1=find(a[i].x),f2=find(a[i].y);
				if(f1==f2)
				{
					ok=0;
					break;
				}
			}
		}
		if(!ok)
		puts("NO");
		else puts("YES");
	}
	return 0;
} 
2021/3/1 21:51
加载中...