算法
并查集+离散化
思路
离散化
sort(l,l+tot);
int start=unique(l,l+tot)-l;
for(int i=1;i<=n;++i){
a[i].x=lower_bound(l,l+start,a[i].x)-l;
a[i].y=lower_bound(l,l+start,a[i].y)-l;
}
并查集
相等的在一个集合
注意
要先处理相等
代码
#include <bits/stdc++.h>
using namespace std;
int t,n,f[1000005],l[1000007*3];
inline long long read(){
long long num=0;int z=1;char c=getchar();
if(c=='-') z=-1;
while((c<'0'||c>'9')&&c!='-') c=getchar();
if(c=='-') z=-1,c=getchar();
while(c>='0'&&c<='9') num=(num<<1)+(num<<3)+(c^48),c=getchar();
return z*num;
}
struct node{
int x,y,e;
}a[1000001];
bool cmp(node a,node b){
return a.e>b.e;
}
inline void pre(int o){
for(int i=1;i<=o;i++) f[i]=i;
}
int get(int x){
if(x==f[x]) return x;
return f[x]=get(f[x]);
}
int main(){
t=read();
while(t--){
int tot=-1;
memset(l,0,sizeof(l));
memset(a,0,sizeof(a));
memset(f,0,sizeof(f));
int flag=1;
n=read();
for(int i=1;i<=n;i++){
a[i].x=read();a[i].y=read();a[i].e=read();
l[++tot]=a[i].x;
l[++tot]=a[i].y;
}
sort(l,l+tot);
int start=unique(l,l+tot)-l;
for(int i=1;i<=n;++i){
a[i].x=lower_bound(l,l+start,a[i].x)-l;
a[i].y=lower_bound(l,l+start,a[i].y)-l;
}
pre(start);
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
int r1=get(a[i].x);
int r2=get(a[i].y);
if(a[i].e){
f[r1]=r2;
}
else if(r1==r2){
printf("NO
");
flag=0;
break;
}
}
if(flag)printf("YES
");
}
return 0;
}