#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int t,n;
vector<int> alls; //声明变长数组用于进行离散化
int find(int x){ //二分查找变长数组中的数据
int l = 0 , r = alls.size();
while(l < r - 1){
int mid = l + (r - l) / 2;
if(alls[mid] >= x) r = mid;
else l = mid;
}
return r;
}
int F(int a , int* f){ //并查集搜索
if(f[a] != a) return F(f[a] , f);
else return a;
}
int main(){
scanf("%d",&t);
for(int i = 0 ; i < t ; i++){
scanf("%d",&n);
int f[100005] ={0};
int ops1[100005][2] = {0};
int ops2[100005][2] = {0};
int x1 = 0 , x2 = 0;
for(int j = 0 ; j < 100005; j++)f[j] = j; //init
for(int j = 0 ; j < n ; j++){
int a, b ,e;
scanf("%d %d %d",&a , &b , &e);
//输入vector
alls.push_back(a);
alls.push_back(b);
//存储操作
if(e == 1){
ops1[j][0] = a;
ops1[j][1] = b;
x1++;
}
else{
ops2[j][0] = a;
ops2[j][1] = b;
x2++;
}
}
//排序+去重
sort(alls.begin(),alls.end());
alls.erase(unique(alls.begin(),alls.end()),alls.end());
//并查集操作
for(int j = 0 ; j < x1 ; j++){
int a = find(ops1[j][0]);
int b = find(ops1[j][1]);
// printf("%d %d\n",a ,b);
f[F(a ,f)] = F(b , f); //合并父亲
}
//查询
int flag = 0;
for(int j = 0 ; j < x2 ; j++){
int a = find(ops2[j][0]);
int b = find(ops2[j][1]);
// printf("%d %d\n",a ,b);
if(f[a] == f[b]){
flag = 1;
break;
}
}
if(flag == 1)printf("NO\n");
else printf("YES\n");
alls.erase(alls.begin(),alls.end()); //释放
}
}
使用了vector进行离散化,自己写了个二分用于查找对应数据,WA的点全部都是该YES的地方是NO,求大佬指点迷津orz