#include <bits/stdc++.h>
using namespace std;
const int N =5e6+10;
int fa[N];
int n;
int cnt;
int ai[N],bi[N],ci[N];
void init()
{
for(int i=1;i<=2*cnt;i++)
{
fa[i]=i;
}
}
int find(int i)
{
return i==fa[i]?i:fa[i]=find(fa[i]);
}
void merge(int x,int y)
{
int fx = find(x);
int fy = find(y);
if(fx==fy)
{
return ;
}
fa[fx] = fy;
}
void solve()
{
cnt = 0;
cin>>n;
bool flag = false;
vector<int>vec;
for(int i=1;i<=n;i++)
{
cin>>ai[i]>>bi[i]>>ci[i];
vec.push_back(ai[i]);
vec.push_back(bi[i]);
}
sort(vec.begin(),vec.end());
unordered_map<int,int>mp;
int sz = vec.size();
mp[vec[0]]=1;
cnt = 1;
for(int i=1;i<sz;i++)
{
if(vec[i]!=vec[i-1])
{
mp[vec[i]]=++cnt;
}
}
for(int i=1;i<=n;i++)
{
ai[i] = mp[ai[i]];
bi[i] = mp[bi[i]];
}
init();
for(int i=1;i<=n;i++)
{
int a = ai[i];
int b = bi[i];
int c = ci[i];
if(c==1)
{
if(find(a)==find(b+cnt)||find(b)==find(a+cnt))flag = true;
merge(a+cnt,b+cnt);
merge(a,b);
}
else
{
if(find(a)==find(b)||find(b+cnt)==find(a+cnt))flag = true;
merge(a,b+cnt);
merge(a+cnt,b);
}
}
if(flag)cout<<"NO\n";
else cout<<"YES\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
经典的种类并查集题目

京公网安备 11010502036488号