程序自动分析——无序离散化+并查集

题面

237. 程序自动分析
在这里插入图片描述
在这里插入图片描述

注意点

这道题的离散化不需要维护相对顺序,因此我们直接用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();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值