rt,代码如下:
#include<bits/stdc++.h>
using namespace std;
long long a[100005],b[100005],e[100005];
long long f[200005];
map <long long,long long> mp;
long long se(long long x)
{
if (f[x]==x) return f[x];
f[x]=se(f[x]);
return f[x];
}
void he(long long x,long long y)
{
if (se(y)!=se(x)) f[se(y)]=se(x);
return;
}
int main()
{
long long t;
cin >> t;
for (long long i=1;i<=t;i++)
{
mp.clear();
bool cmp=false;
long long n;
long long cnt=0;
cin >> n;
for (long long j=1;j<=n;j++)
{
scanf("%d %d %d",&a[j],&b[j],&e[j]);
if (!mp[a[j]])
{
cnt++;
mp[a[j]]=cnt;
}
if (!mp[b[j]] && a[j]!=b[j])
{
cnt++;
mp[b[j]]=cnt;
}
}
for (long long j=1;j<=100000;j++)
{
f[j]=j;
f[j+100000]=j+100000;
}
for (long long j=1;j<=n;j++)
{
if (a[j]==b[j] && e[j]==0)
{
cout << "NO" << endl;
cmp=true;
break;
}
if (se(mp[a[j]])==se(mp[b[j]]) && e[j]==0 || se(mp[a[j]]+100000)==se(mp[b[j]]+100000) && e[j]==1 && a[j]!=b[j])
{
// cout << j << " " << fx << " " << fy << endl;
cout << "NO" << endl;
cmp=true;
break;
}
if (a[j]==b[j]) continue;
if (e[j]==1) he(mp[a[j]],mp[b[j]]);
else he(mp[a[j]]+100000,mp[b[j]]+100000);
}
for (long long j=n;j>=1 && !cmp;j--)
{
if (a[j]==b[j] && e[j]==0)
{
cout << "NO" << endl;
cmp=true;
break;
}
if (se(mp[a[j]])==se(mp[b[j]]) && e[j]==0 || se(mp[a[j]]+100000)==se(mp[b[j]]+100000) && e[j]==1 && a[j]!=b[j])
{
// cout << j << " " << fx << " " << fy << endl;
cout << "NO" << endl;
cmp=true;
break;
}
if (a[j]==b[j]) continue;
if (e[j]==1) he(mp[a[j]],mp[b[j]]);
else he(mp[a[j]]+100000,mp[b[j]]+100000);
}
if (!cmp) cout << "YES" << endl;
}
return 0;
}