为什么初始化并查集数组的时候,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;
}