救救孩子...... (mp是用于离散化的,cnt是个时间戳)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<memory.h>
#include<map>
#include<vector>
#include<set>
#include<stack>
#define int long long
using namespace std;
int t;
int n,u,v,e,cnt;
int root[2000050];
map<int,int> mp;
stack<pair<int,int> > st;
int f_f(int x){
if(root[x]!=x){
root[x]=f_f(root[x]);
}
return root[x];
}
void mer(int u,int v){
root[f_f(u)]=f_f(v);
}
void solve(){
for(int i=1;i<=2000000;i++){
root[i]=i;
}
mp.clear();
cnt=1;
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>u>>v>>e;
if(e){
if(mp[u]==0){
mp[u]=cnt;
cnt++;
}
if(mp[v]==0){
mp[v]=cnt;
cnt++;
}
mer(mp[u],mp[v]);
}else{
st.push(make_pair(u,v));
}
}
while(!st.empty()){
u=st.top().first;
v=st.top().second;
st.pop();
// cout<<"("<<mp[u]<<","<<mp[v]<<"):("<<f_f(mp[u])<<","<<f_f(mp[v])<<")"<<endl;
if(f_f(mp[u])==f_f(mp[v])){
cout<<"NO"<<endl;
return;
}
}
cout<<"YES"<<endl;
return;
}
signed main(){
scanf("%d",&t);
while(t--){
solve();
}
return 0;
}