我觉得是NOI史上最简单的题目了,没有之一。
题目分析:
我们把相等的变量合并起来,然后最后在扫一遍不同的变量是否在一个块里。
可能变量很大,离散化一下。
题目链接:
Ac Code:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxm=1e7+1;
int fat[maxm],val[maxm];
struct node{
int u,v,f;
};
node a[maxm];
int find(int x)
{
if(fat[x]==x) return x;
return fat[x]=find(fat[x]);
}
bool work()
{
int n;
scanf("%d",&n);
for(int i=1;i<=2*n;i++)
fat[i]=i;
int tot=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].f);
val[++tot]=a[i].u,val[++tot]=a[i].v;
}
sort(val+1,val+tot+1);
int t=unique(val+1,val+tot+1)-val-1;
for(int i=1;i<=n;i++)
{
int id1=lower_bound(val+1,val+t+1,a[i].u)-val;
int id2=lower_bound(val+1,val+t+1,a[i].v)-val;
if(a[i].f) fat[find(id1)]=find(id2);
}
for(int i=1;i<=n;i++)
{
int id1=lower_bound(val+1,val+t+1,a[i].u)-val;
int id2=lower_bound(val+1,val+t+1,a[i].v)-val;
if(!a[i].f)
if(find(id1)==find(id2)) return 0;
}
return 1;
}
int main()
{
//freopen("prog.in","r",stdin);
//freopen("prog.out","w",stdout);
int t;
scanf("%d",&t);
while(t--)
{
if(work()) printf("YES\n");
else printf("NO\n");
}
return 0;
}