#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>vec;
int fa[200005];
struct MyStruct
{
int x, y,z;
}a[100005];
int find(int x)
{
if (fa[x] == x) return x;
return fa[x] = find(fa[x]);
}
bool cmp(MyStruct x, MyStruct y)
{
return(x.z > y.z);
}
void merge(int x, int y)
{
fa[find(x)]=find(y);
}
int main()
{
int t;
cin >> t;
while (t--)
{
int n,flag=0;
cin >> n;
for (int i = 0; i <= n; i++)
{
fa[i] = i;
}
for (int i = 1; i <= n; i++)
{
cin >> a[i].x >> a[i].y>>a[i].z;
vec.push_back(a[i].x);
vec.push_back(a[i].y);
}
sort(vec.begin(), vec.end());
int reu = unique(vec.begin(), vec.end()) - vec.begin();
for (int i = 1; i <= n; ++i) {
a[i].x = lower_bound(vec.begin(), vec.begin() + reu, a[i].x) - vec.begin();
a[i].y = lower_bound(vec.begin(), vec.begin() + reu, a[i].y) - vec.begin();
}
sort(a + 1, a + 1 + n, cmp);
for (int i = 1; i <= n; i++)
{
int x = a[i].x;
int y = a[i].y;
if (a[i].z == 1)
{
merge(x, y);
}
else if(find(x) == find(y))
{
cout << "NO" << endl;
flag = 1;
break;
}
}
vec.clear();
if (flag) continue;
else cout << "YES" << endl;
}
return 0;
}
WA#2#3#8,思路和第一个题解一样,写出来就是70 照着他改了很久还是70,还有有点疑惑,为什么 并查集fa数组要开2e5,不然#2会RE,离散化后 最大不是1e5吗,为什么fa数组要开2e5