原题
需要离散化的并查集题,留作个笔记
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5 + 10;
int n, cnt;
vector<PII>eqs;//可以相等的两个数
vector<PII>uneqs;//不可相等的两个数
unordered_map<int, int> H;
int p[N * 2];
int mapping(int x) {
if (H.count(x))
return H[x];
return H[x] = cnt++;
}
int find(int x) {
if (p[x] != x)
p[x] = find(p[x]);
return p[x];
}
void slove() {
cin >> n;
cnt = 0;
H.clear();
eqs.clear();
uneqs.clear();
for (int i = 0; i < n; i++) {
int x, y, e;
cin >> x >> y >> e;
x = mapping(x), y = mapping (y);
if (e) {
//如果是连接
eqs.push_back({
x, y});
} else {
uneqs.push_back({
x, y});
}
}
for (int i = 0; i < cnt; i++) {
p[i] = i;
}
for (auto it : eqs)
p[find(it.first)] = find(it.second);
bool flag = true;
for (auto it : uneqs) {
if (find(it.first) == find(it.second)) {
cout << "NO" << endl;
return;
}
}
cout << "YES" << endl;
}
int main() {
int T;
cin >> T;
while (T--) {
slove();
}
}