考点:并查集,离散化。
这题题意很明确,做法也很明确。
先对友好的弄一个并查集,最后再查询敌人是否为友好关系。

#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;
}