RT,代码如下
#include <bits/stdc++.h>
#define rint register int
#define int long long
#define endl '\n'
using namespace std;
const int N = 1e6 + 5;
const int M = N << 2;
int T;
int n, m;
int fa[N];
int idx = 0;
int book[M], b[M];
bool flag;
struct node
{
int x, y;
int e;
}f[N];
bool cmp(node a, node b)
{
return a.e > b.e;
}
int find(int x)
{
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
int query(int x)
{
return lower_bound(b + 1, b + m + 1, x) - b;
}
signed main()
{
cin >> T;
while (T--)
{
memset(book, 0, sizeof book);
idx = 0;
flag = 1;
cin >> n;
for (rint i = 1; i <= n; i++)
{
cin >> f[i].x >> f[i].y >> f[i].e;
book[++idx] = f[i].x;
book[++idx] = f[i].y;
}
for (rint i = 1; i <= idx; i++)
{
b[i] = book[i];
}
sort(b + 1, b + idx + 1);
int m = unique(b + 1, b + idx + 1) - b - 1;
sort(f + 1, f + n + 1, cmp);
for (rint i = 1; i <= m; i++)
{
fa[i] = i;
}
for (rint i = 1; i <= n; i++)
{
int a = query(f[i].x);
int b = query(f[i].y);
int x = find(a);
int y = find(b);
if (f[i].e == 1) fa[x] = y;
else if (x == y)
{
puts("NO");
flag = 0;
break;
}
}
if(flag) puts("YES");
}
return 0;
}