思路
这道题首先很容易得出结论:
如果
e
=
1
e=1
e=1 就把数加入并查集,如果
e
=
0
e=0
e=0 就判断数是否加入并查集。
然后很烦的就是数据太大,要离散化,调了我好久。
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int fa[1001000],d[3000010];
int t,e,n,m,w,l;
struct node
{
int x,y,e;
}a[1000100];
int find(int f)
{
if(fa[f]==f)
return f;
return fa[f]=find(fa[f]);
}
bool cmp(const node&l,const node&r)
{
return l.e>r.e;
}
int main()
{
cin>>t;
while(t--)
{
memset(d,0,sizeof(d));
memset(fa,0,sizeof(fa));
scanf("%d",&n);
l=0,w=1;
for(int i=1; i<=n; i++)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].e);
d[++l]=a[i].x;
d[++l]=a[i].y;
}
sort(d+1,d+1+l);
int wd=unique(d+1,d+1+l)-d;
for(int i=1; i<=n; i++)
{
a[i].x=lower_bound(d+1,d+1+wd,a[i].x)-d;
a[i].y=lower_bound(d+1,d+1+wd,a[i].y)-d;
}
sort(a+1,a+1+n,cmp);
for(int i=1; i<=wd; i++)
fa[i]=i;
for(int i=1; i<=n; i++)
{
int fx=find(a[i].x),fy=find(a[i].y);
if(a[i].e==1)
{
if(fx!=fy)
fa[fx]=fy;
}
else
{
if(fx==fy)
{
w=0;
break;
}
}
}
if(w==0)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}