题面
注意点
这道题的离散化不需要维护相对顺序,因此我们直接用unordered_map
;
注意我们离散化了,因此注意并查集的上限是hash_val
因此初始化的并查集时候需要注意,如下
//p(i)是并查集
for(int i=1;i<=hash_val;++i){
p[i] = i;
}
Code
#include <iostream>
#include <unordered_map>
using namespace std;
const int N = 2e5+10;
int hash_val,p[N];
unordered_map<int,int> um;
int get(int x){
if(um.count(x) == 0) um[x] = ++hash_val;
return um[x];
}
struct Node{
int x,y,e;
}query[N];
int _find(int x){
if(x == p[x]) return x;
return p[x] = _find(p[x]);
}
void _merge(int x,int y){
int px = _find(x),py = _find(y);
p[px] = py;
}
void solve(){
um.clear();
hash_val = 0;
int n;
cin >> n;
for(int i=1,x,y,e;i<=n;++i){
cin >> x >> y >> e;
query[i] = {get(x),get(y),e};
}
for(int i=1;i<=hash_val;++i){
p[i] = i;
}
for(int i=1;i<=n;++i){
if(query[i].e == 1){
_merge(query[i].x,query[i].y);
}
}
bool flag = 1;
for(int i=1;i<=n;++i){
if(query[i].e == 0){
int px = _find(query[i].x);
int py = _find(query[i].y);
if(px == py){
flag = 0;
break;
}
}
}
if(flag){
cout << "YES\n";
}else{
cout << "NO\n";
}
}
int main(){
std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t;
cin >> t;
while(t--){
solve();
}
}