洛谷P1955

P1955 [NOI2015] 程序自动分析

虽然说这题和上一题一样都是离散化,多了并查集,但我不觉得并查集多难,难点还是在于离散化,大多数题解都不喜欢使用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;
}
posted @ 2025-05-17 13:28  Chuan81  阅读(16)  评论(0)    收藏  举报