考点:并查集,离散化。
这题题意很明确,做法也很明确。
先对友好的弄一个并查集,最后再查询敌人是否为友好关系。
#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;
}
京公网安备 11010502036488号