567炸掉了() 找了半天错估计是并查集的问题
#include<bits/stdc++.h>
using namespace std;
struct hash_dsu{
struct node{
long long fa,fid,r,val,id,nt;
} v[5000003];
long long p=1000007;
int tot,h[2000010];
queue<int> q;
int New(long long x){
tot++;
v[tot]={x,tot,1,x,tot,h[(x-1)%p+1]};
if(!h[(x-1)%p+1]) q.push((x-1)%p+1);
h[(x-1)%p+1]=tot;
return tot;
}
int take(long long x){
int i=h[(x-1)%p+1];
while(v[i].val!=x && i!=0) i=v[i].nt;
if(i==0) return New(x);
return i;
}
node getfather(int x){return (x==v[x].fid)? v[x] : v[v[x].fid]=getfather(v[x].fid);}
int get(int x){node temp=getfather(x);return temp.id;}
void merge(long long a,long long b){
int x=take(a),y=take(b);
int fx=get(x),fy=get(y);
if(fx==fy) return;
if(v[fx].r>v[fy].r) swap(fx,fy);
v[fx].fid=fy;
v[fx].fa=v[fy].val;
v[fy].r+=v[fx].r;
}
void clr()
{
tot=0;
while(!q.empty())
{
int x=q.front();
q.pop();
h[x]=0;
}
v[0]={0,0,0,0,0,0};
}
int init()
{
tot=0;
}
int check(long x,long y){if(get(take(x))==get(take(y))) return 1;return 0;}
int num(int x){return getfather(x).r;}
} DSU;
pair<int,int> a[1000003];
int top=0;
void add(int x,int y)
{
top++;
a[top]={x,y};
}
int main()
{
int t;
cin>>t;
for(int i=1;i<=t;i++)
{
DSU.clr();
top=0;
int bo=1;
int n;
scanf("%d",&n);
for(int j=1;j<=n;j++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(z==1)
{
/*if(x!=y)*/ DSU.merge(x,y);
}
else /*if(x!=y)*/add(x,y);
// cout<<x<<' '<<y<<' '<<DSU.get(DSU.take(2))<<' '<<DSU.get(DSU.take(9))<<' '<<DSU.check(2,9)<<' '<<DSU.get(DSU.take(2))<<' '<<DSU.get(DSU.take(9))<<endl;
}
for(int j=1;j<=top;j++)
{
if(DSU.check(a[j].first,a[j].second) && bo)
{
bo=0;
}
}
if(bo) puts("YES");
else puts("NO");
}
return 0;
}