思路
- 将相等和不相等的条件分开存储,先将相等的条件纳入一个集合,然后遍历不相等的数组,判断两个不相等的条件是否已经在一个集合内即可
- WA了几次后,发现数据范围很大,需要离散化
AC代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1e6 + 10;
typedef pair<int, int > PII;
int p[N]; // 并查集
int t, n;
PII a1[N], a0[N]; // 将相等和不相等的问题分开存储
int len1, len0;
int u[N]; // 用来离散化的数组
int lenu;
int find(int x){
return x == p[x] ? x : p[x] = find(p[x]);
}
int main(){
scanf("%d", &t);
while(t--){
lenu = len1 = len0 = 0;
scanf("%d", &n);
for(int i = 0; i <= N - 1; ++i) p[i] = i; // 并查集初始化,因为是多组数据所以需要注意要把所有的p[i]都初始化一下
for(int i = 0; i < n; ++i){
int a, b, c; scanf("%d%d%d", &a, &b, &c);
u[lenu ++] = a; u[lenu ++] = b;
if(c == 1) {
a1[len1].first = a, a1[len1].second = b;
len1++;
}else {
a0[len0].first = a, a0[len0].second = b;
len0++;
}
}
// 离散化
sort(u, u + lenu);
lenu = unique(u, u + lenu) - u;
for(int i = 0; i < len1; ++i) {
int a = lower_bound(u, u + lenu, a1[i].first) - u;
int b = lower_bound(u, u + lenu, a1[i].second) - u;
p[find(a)] = find(b);
}
bool flag = true;
for(int i = 0; i < len0; ++i){
int a = lower_bound(u, u + lenu, a0[i].first) - u;
int b = lower_bound(u, u + lenu, a0[i].second) - u;
if(find(a) == find(b)){
flag = false;
break;
}
}
if(flag) puts("YES");
else puts("NO");
}
return 0;
}