第一次做的時候一看數據範圍是1e9,就不打算用並查集做
第一次想到的是用bitset來做,但是超時了,很難受
後來看了其他博主的文章才獲得啓發,這裏使用了Hash,對於每一個數重新定義自己的順序
利用一個map可以很容易的進行Hash
#include<map>
#include<bitset>
#include<cstdio>
#include<iostream>
using namespace std;
map<int,int> 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;
}