RT,离散化和并查集合在一起就不会写了……(本质上还是太菜了呀,普及难度的题目都不会写了)。
#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <algorithm>
#define MAXN 1000010
#define ZZ register int
using namespace std;
struct a {
int x, y, e;
} require[MAXN];
map<int, int> mp;
int T, N, cnt, fa[MAXN], order[MAXN], num[MAXN << 1];
inline int read() {
ZZ x = 0, f = 1;
char ch = getchar();
while (!isdigit(ch)) {
if (ch == '-') f = -1;
ch = getchar();
}
while (isdigit(ch)) {
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
inline void init() {
N = read();
memset(num, 0, sizeof(num));
memset(fa, 0, sizeof(fa));
memset(order, 0, sizeof(order));
mp.clear();
for (ZZ i = 1; i <= N; i++) {
require[i].x = read(); require[i].y = read(); require[i].e = read();
num[++cnt] = require[i].x; num[++cnt] = require[i].y;
}
sort(num, num + cnt);
ZZ m = unique(num, num + cnt) - num;
for (ZZ i = 0; i < m; i++)
mp[num[i]] = i + 1;
for (ZZ i = 0; i < cnt; i++)
fa[i] = i;
}
inline int find(int x) {
if (x == fa[x]) return x;
return fa[x] = find(fa[x]);
}
inline void unite(int x, int y) {
x = find(x); y = find(y);
if (x == y) return;
fa[y] = x;
}
inline bool same(int x, int y) {
return find(x) == find(y);
}
int main() {
T = read();
while (T--) {
init();
bool flag = true;
for (ZZ i = 1; i <= N; i++) {
if (require[i].e == 1)
unite(mp[require[i].x], mp[require[i].y]);
else if (require[i].e == 0) {
if (same(mp[require[i].x], mp[require[i].y])) {
flag = false;
break;
}
}
}
if (flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}