洛谷P1955
虽然说这题和上一题一样都是离散化,多了并查集,但我不觉得并查集多难,难点还是在于离散化,大多数题解都不喜欢使用unique我实在不太理解,STL设计出来就是给人用的啊。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 10;
vector<int> parent(MAXN);
int find(int x) {
if(parent[x] == x) return x;
return parent[x] = find(parent[x]);
}
void unite(int x, int y) {
int fx = find(x);
int fy = find(y);
if(fx != fy) {
parent[fx] = fy;
}
}
void solve() {
int n; cin >> n;
vector<tuple<int, int, int>> cons(n);
vector<int> values;
for(int i = 0; i < n; i++) {
int a, b, e;
cin >> a >> b >> e;
cons[i] = {a, b, e};
values.push_back(a);
values.push_back(b);
}
sort(values.begin(), values.end());
values.erase(unique(values.begin(), values.end()), values.end());
unordered_map<int, int> mp;
for(int i = 0; i < values.size(); i++) {
mp[values[i]] = i;
parent[i] = i;
}
for(const auto& [a, b, e] : cons) {
if(e == 1) {
int x = mp[a];
int y = mp[b];
unite(x, y);
}
}
bool ans = 1;
for(const auto& [a, b, e] : cons) {
if(e == 0) {
int x = mp[a];
int y = mp[b];
if(find(x) == find(y)) {
ans = 0;
break;
}
}
}
cout << (ans ? "YES" : "NO") << '\n';
}
int main() {
int t; cin >> t;
while(t--) {
solve();
}
return 0;
}

浙公网安备 33010602011771号