程序自动分析
题目链接:程序自动分析
题目描述
解题思路
因为数据太大,所以我们要离散化,然后跑并查集即可。
code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int T;
int n;
int d[1000010];
int fa[1000010];
struct abc{
int x,y,z;
}a[1000010];
bool cmp(abc a,abc b)
{
return a.z>b.z;
}
int fd(int now)
{
if(fa[now]==now)
return now;
return fa[now]=fd(fa[now]);
}
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,ok=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[fd(a[i].x)]=fd(a[i].y);
else if(fd(a[i].x)==fd(a[i].y))
{
ok=0;
break;
}
}
if(ok)
printf("YES\n");
else
printf("NO\n");
}
}