本题原名“程序自动分析”
分析
离散化+并查集
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int t,n,d[1000001],fa[1000001];
struct lwx
{
int x,y,z;
}a[1000001];
int cmp(lwx a,lwx b)
{
return a.z>b.z;
}
int father(int k)
{
if(fa[k]==k) return k;
return fa[k]=father(fa[k]);
}
int main()
{
cin>>t;
while(t--)
{
memset(d,0,sizeof(d));
memset(a,0,sizeof(a));
memset(fa,0,sizeof(fa));
cin>>n;
int m=0,jq=1;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
d[++m]=a[i].x;
d[++m]=a[i].y;
}
sort(d+1,d+m+1);
int l=unique(d+1,d+m+1)-d;
for(int i=1;i<=n;i++)
{
a[i].x=lower_bound(d+1,d+l+1,a[i].x)-d;
a[i].y=lower_bound(d+1,d+l+1,a[i].y)-d;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=l;i++)
{
fa[i]=i;
}
for(int i=1;i<=n;i++)
{
if(a[i].z==1)
{
fa[father(a[i].x)]=father(a[i].y);
}
else if(father(a[i].x)==father(a[i].y))
{
jq=0;
break;
}
}
if(jq) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}