#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
class dsu {
vector<int> par;
vector<int> rank;
public:
dsu(int n): par(n + 1), rank(n + 1) {
for (int i = 0; i <= n; i++) {
par[i] = i;
rank[i] = 1;
}
}
int find(int k) {
if (par[k] == k) return k;
return par[k] = find(par[k]);
}
void unit(int x, int y) {
x = find(x);
y = find(y);
if (x == y) return;
if (rank[x] < rank[y]) swap(x, y);
par[y] = x;
rank[x] += rank[y];
}
inline bool same(int x, int y) {
return find(x) == find(y);
}
};
void solve() {
int n;
cin >> n;
vector<int> ai(n);
vector<int> bi(n);
vector<int> ci(n);
vector<int> d(2*n);
int cnt = -1;
for (int i = 0; i < n; i++) {
cin >> ai[i] >> bi[i] >> ci[i];
d[++cnt] = ai[i];
d[++cnt] = bi[i];
}
sort(d.begin(),d.end());
auto ed = unique(d.begin(), d.end());
for (int i = 0; i < n; i++)
{
ai[i] = lower_bound(d.begin(),ed,ai[i]) - d.begin();
bi[i] = lower_bound(d.begin(),ed,bi[i]) - d.begin();
}
dsu tree1(ed-d.begin());
dsu tree2(ed-d.begin());
for(int i = 0;i<n;i++) {
if(ci[i] == 1) {
if(tree2.same(ai[i], bi[i])) return void(cout << "NO" << endl);
tree1.unit(ai[i],bi[i]);
} else {
if(tree1.same(ai[i], bi[i])) return void(cout << "NO" << endl);
tree2.unit(ai[i],bi[i]);
}
}
return void(cout << "YES" << endl);
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
并查集加上离散化,注意离散化的去重操作

京公网安备 11010502036488号