HYSBZ - 4195 并查集

第一次做的时候一看数据范围是1e9,就不打算用并查集做

第一次想到的是用bitset来做,但是超时了,很难受

后来看了其他博主的文章才获得启发,这里使用了Hash,对于每一个数重新定义自己的顺序

利用一个map可以很容易的进行Hash

#include
#include
#include
#include
using namespace std;
map ma;
const int maxn = 1000000 + 5;
int p[maxn*2];
int id;
int getid(int x){
    return ma[x] ? ma[x] : ma[x] = ++id;
}
int tofind(int x){
    if(x == p[x]) return x;
    return p[x] = tofind(p[x]);
}
struct rs{
    int a, b, c;
}e[maxn];
int main(){
    int T,n;
    scanf("%d", &T);
    while(T--){
        bool YES = true;
        id = 0;
        ma.clear();
        scanf("%d", &n);
        int fa, fb;
        for(int i = 0; i <= 2*n; i++) p[i] = i;
        for(int i = 0; i < n; i++){
            scanf("%d%d%d", &e[i].a, &e[i].b, &e[i].c);
            if(e[i].c){
                fa = tofind(getid(e[i].a));
                fb = tofind(getid(e[i].b));
               // printf("fa = %d, fb = %d\n", fa, fb);
                if(fa != fb)
                    p[fa] = fb;
            }
        }
        for(int i = 0; i < n; i++){
           // printf("i = %d, a = %d, b = %d, c = %d \n", i, e[i].a, e[i].b, e[i].c);
            if(e[i].c == 0){
                fa = tofind(getid(e[i].a));
                fb = tofind(getid(e[i].b));
               // printf("Fa = %d, Fb = %d\n", fa, fb);
                if(fa == fb){
                    YES = false;
                    break;
                }
            }
            if(!YES) break;
        }
        if(YES){
            printf("YES\n");
        }
        else{
            printf("NO\n");
        }
    }

    return 0;
}

你可能感兴趣的:(陆历川)