题目

代码(注意不是把p修改为unordered_map,而是增加一个get)
#include <bits/stdc++.h>
using namespace std;const int N = 2e5+10; //n个数据,可能引入2*n个离散点int p[N];
bool cannot;
unordered_map<int, int> mp;
int n, idx, cnt;struct req
{int a, b;
} q[N];int get(int x)
{if(mp.count(x)) return mp[x];else return mp[x] = ++idx;
}
int find(int x) // 并查集
{if (p[x] != x) p[x] = find(p[x]);return p[x];
}int main()
{int t;scanf("%d", &t);while(t--){scanf("%d", &n);idx = 0;cnt = 0;cannot = false;mp.clear();for(int i = 1; i <= 2 * n; i++) p[i] = i; //n个数据,可能引入2*n个离散点for(int i = 1; i <= n; i++){int a, b, op; scanf("%d%d%d", &a, &b, &op);a = get(a), b = get(b);if(op){int pa = find(a), pb = find(b);if(pa != pb) p[pa] = pb;}else q[++cnt] = {a, b};}for(int i = 1; i <= cnt; i++){int pa = find(q[i].a), pb = find(q[i].b);if(pa == pb){puts("NO");cannot = true;break;}}if(!cannot) puts("YES");}
}