在HZOJ上100pts,这里30pts,只对了#1#8#9,求调玄关
#include<iostream>
#include<cstdio>
#include<vector>
#include<unordered_map>
using namespace std;
class unionSet{
public:
unionSet(int n):fa(n+1){
for(int i=0;i<=n;i++)fa[i]=i;
}
int find(int x){
return fa[x]=(fa[x]==x?x:find(fa[x]));
}
void merge(int a,int b){
if(find(a)!=find(b))
fa[find(a)]=find(b);
return;
}
vector<int> fa;
};
int main()
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
int n,cnt=0;
scanf("%d",&n);
unionSet u(2*n);
unionSet v(2*n);
bool flag=1;
unordered_map<long long,int> m;
for(int i=1;i<=n;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a==b&&c==1)continue;
if(m.find(a)!=m.end()) a=m[a];
else m.insert(make_pair(a,cnt)),a=cnt,cnt++;
if(m.find(b)!=m.end()) b=m[b];
else m.insert(make_pair(b,cnt)),b=cnt,cnt++;
if(c==0){
if(u.find(a)==u.find(b)){
flag=0;
continue;
}
else
v.merge(a,b);
}
else{
if(v.find(a)==v.find(b)){
flag=0;
continue;
}
else
u.merge(a,b);
}
}
if(flag)printf("YES\n");
else printf("NO\n");
}
return 0;
}