BZOJ4195 离散化+并查集

BZOJ4195

debug了好久都快烦了呜呜呜呜呜呜呜呜呜呜

//
// Created by Arc on 2021/2/3.
//

#include <bits/stdc++.h>
#include <unordered_map>
using namespace std;
typedef pair<int, int> P;
const int N = 2e5 + 5;
vector<P> v1, v2;
int n,m,tot;
int fa[1000000];
unordered_map<int,int> mp;
void init(){
    for (int i = 0; i < tot; ++i) {
        fa[i]=i;
    }
}
int get(int x){
    if(fa[x]==x)
        return x;
    return fa[x]=get(fa[x]);
}
void merge(int x,int y){
    fa[get(x)]=get(y);
}
int get_map(int x){
    if(mp.count(x)) return mp[x];
    return mp[x]=tot++;
}
int main(){
    int t;
    cin>>t;
    while(t--){
        cin>>n;
        tot=0;

        for (int i = 1; i <= n ; ++i) {
            int x,y,e;
            cin>>x>>y>>e;
            x=get_map(x);
            y=get_map(y);//离散化
            if(e)
                v1.emplace_back(x,y);
            else
                v2.emplace_back(x,y);
        }
        //并查集
        init();
        int v1_num=v1.size();
        int v2_num=v2.size();
        for (int i = 0; i < v1_num; ++i) {
            merge(v1[i].first,v1[i].second);
        }
        bool flag=true;
        for(int i = 0; i < v2_num; ++i){
            if(get(v2[i].first)==get(v2[i].second)) {
                flag = false;
                break;
            }
        }
        if(flag){
            cout<<"YES"<<endl;
        }else{
            cout<<"NO"<<endl;
        }
        //不要忘记清空
        mp.clear();
        v1.clear();
        v2.clear();

    }
    return 0;
}
为了自己,和那些爱你的人
原文地址:https://www.cnblogs.com/zhmlzhml/p/14368236.html