题目大意:
中文题,题目链接
题解:
并查集+离散化
如果两个数相等的话,放入一个并查集,再判断不相等的两个数是否属于一个并查集。
比较水。。。然而蒟蒻还是错了一遍。。。
代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000015;
struct node{
int x,y,z;
}sa[N];
int sd[N*2];
int t,n,cnt;
int fa[N*2];
int findfa(int x)
{
if(x==fa[x]) return x;
fa[x]=findfa(fa[x]);
return fa[x];
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
cnt=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&sa[i].x,&sa[i].y,&sa[i].z);
sd[++cnt]=sa[i].x;sd[++cnt]=sa[i].y;
}
sort(sd+1,sd+1+cnt);
for(int i=1;i<=n;i++)
{
sa[i].x=lower_bound(sd+1,sd+cnt+1,sa[i].x)-sd;
sa[i].y=lower_bound(sd+1,sd+cnt+1,sa[i].y)-sd;
}
bool flag=0;
for(int i=1;i<=cnt;i++) fa[i]=i;
for(int i=1;i<=n;i++)
{
if(sa[i].z==1)
{
int tx=findfa(sa[i].x),ty=findfa(sa[i].y);
fa[ty]=tx;
}
}
for(int i=1;i<=n;i++)
{
if(!sa[i].z)
{
int tx=findfa(sa[i].x),ty=findfa(sa[i].y);
if(tx==ty)
{
flag=1;
break;
}
}
}
if(flag==0) printf("YES\n");
else printf("NO\n");
}
}