考点:并查集,离散化。
这题题意很明确,做法也很明确。
先对友好的弄一个并查集,最后再查询敌人是否为友好关系。
#include <bits/stdc++.h> #include <unordered_map> using namespace std; typedef long long ll; typedef unsigned long long ull; const int mod = 10000; const int N = 5e6 + 10; int pre[N]; int a[N]; int b[N]; int c[N]; int d[N]; int find(int a) { return pre[a] == a ? a : pre[a] = find(pre[a]); } int main() { #ifdef LOCAL freopen("E:/input.txt", "r", stdin); #endif int t; cin >> t; while (t--) { int n, cnt = 0; cin >> n; int flag = 1; for (int i = 1; i <= n; i++) { scanf("%d%d%d", &a[i], &b[i], &c[i]); d[++cnt] = a[i]; d[++cnt] = b[i]; } sort(d + 1, d + cnt + 1); cnt = unique(d + 1, d + cnt + 1) - d; for (int i = 1; i <= n; i++) { a[i] = lower_bound(d + 1, d + cnt + 1, a[i]) - d; b[i] = lower_bound(d + 1, d + cnt + 1, b[i]) - d; } for (int i = 1; i <= cnt; i++) { pre[i] = i; } for (int i = 1; i <= n; i++) { if (c[i] == 1) { int u = find(a[i]); int v = find(b[i]); pre[u] = v; } } for (int i = 1; i <= n; i++) { if (c[i] != 1) { int u = find(a[i]); int v = find(b[i]); if (u == v) flag = 0; } } if (flag) puts("YES"); else puts("NO"); } return 0; }