题目分析:
- 将相等的合并在同一个集合中,最后再判断
x
!
=
y
x!=y
x!=y如果在一个集合中,就不满足约束
- 由于
x
,
y
很
大
x,y很大
x,y很大,需要离散化
- 先
s
o
r
t
sort
sort,再
u
n
i
q
u
e
unique
unique,再
l
o
w
e
r
lower
lower_
b
o
u
n
d
bound
bound
-
r
a
n
k
rank
rank是保留字,不要用!!打下划线!!!!
Code:
#include <bits/stdc++.h>
using namespace std;
#define maxn 1000010
int rank_[maxn<<1],m,T,n,x[maxn],sum=0,y[maxn],pd[maxn],d[maxn<<1],top=0,f[maxn<<1];
struct ndoe {
int u,v;
}st[maxn];
inline void init_() {
freopen("a.txt","r",stdin);
}
inline int read_() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
return x*f;
}
inline void lisan_() {
sort(d+1,d+sum+1);
m=unique(d+1,d+sum+1)-d-1;
for(int i=1;i<=n;++i) {
x[i]=lower_bound(d+1,d+m+1,x[i])-d;
y[i]=lower_bound(d+1,d+m+1,y[i])-d;
}
}
int find_(int x) {
if(f[x]==x) return x;
else return f[x]=find_(f[x]);
}
inline void merge_(int x,int y) {
int fx=find_(x),fy=find_(y);
if(fx==fy) return;
if(rank_[fx]>rank_[fy]) swap(fx,fy);
f[fx]=fy;
rank_[fy]=max(rank_[fy],rank_[fx]+1);
}
void readda_() {
T=read_();
while(T--) {
n=read_();
sum=0;top=0;
for(int i=1;i<=n;++i) {
x[i]=read_();y[i]=read_();pd[i]=read_();
d[++sum]=x[i];d[++sum]=y[i];
}
lisan_();
for(int i=0;i<=m+1;++i) {
f[i]=i;
rank_[i]=1;
}
for(int i=1;i<=n;++i) {
if(pd[i]) {
merge_(x[i],y[i]);
}
else {
st[++top].u=x[i];
st[top].v=y[i];
}
}
int pdc=0;
for(int i=1;i<=top;++i) {
int fx=find_(st[i].u),fy=find_(st[i].v);
if(fx==fy) {
printf("NO\n");
pdc=1;
break;
}
}
if(pdc) continue;
else printf("YES\n");
}
}
int main() {
init_();
readda_();
return 0;
}