#include<bits/stdc++.h>
using namespace std;
int n,t;
struct node {
int ii,jj,ee;
} q[3000006];
int d[3000006],c[3000006],dtop,ctop,fa[3000006];
int find(int x) { //查找父节点
if(fa[x]!=x)return fa[x]=find(fa[x]);
else return x;
}
void join(int x,int y) { //合并两个集合
int fx=find(x),fy=find(y);
if(fx!=fy)fa[fx]=fy;
}
int main() {
cin>>t;
while(t--) {
dtop=ctop=0;
memset(d,0,sizeof(d));
memset(c,0,sizeof(c));
memset(fa,0,sizeof(fa));
cin>>n;
for(int i=1; i<=n; i++) {
cin>>q[i].ii>>q[i].jj>>q[i].ee;
if(q[i].ee==1)d[++dtop]=q[i].ii,d[++dtop]=q[i].jj;
}
sort(d+1,d+dtop+1);
for(int i=1; i<=dtop; i++)
if(i==1||d[i]!=d[i-1])c[++ctop]=d[i]; //去重
//离散化
for(int i=1; i<=ctop; i++)fa[i]=i;
for(int i=1; i<=n; i++) {
if(q[i].ee==1) { //等于
int x=lower_bound(c+1,c+ctop,q[i].ii)-c;
int y=lower_bound(c+1,c+ctop,q[i].jj)-c;
join(x,y);
}
}
bool flag=1;
for(int i=1; i<=n; i++) {
if(q[i].ee==0) { //不等于
if(find(q[i].ii)==find(q[i].jj)) {
flag=0;
break;
}
}
}
if(flag==1)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
看了很久也没看出哪里有问题,RE了一个点,WA了7个点,各位大佬们帮忙看看吧