题目链接:点击这里
题目中数据范围 ,但 ,所以实际用到的数据只有 ,首先将下标离散化,方便后面的并查集操作。
所有约束条件的顺序对结果是否矛盾无影响,因此,可先考虑所有相等的约束条件,再考虑不等的约束条件。前者不会产生矛盾,后者 但 与 已在同一集合中时,就会产生矛盾。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int N = 2000010;
unordered_map<int,int> mp;
int f[N];
int n;
struct node {
int x, y, e;
}q[N];
int get(int x) // 离散化
{
if(mp.count(x) == 0) mp[x] = ++n;
return mp[x];
}
int find(int x)
{
if(f[x] != x) f[x] = find(f[x]);
return f[x];
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
n = 0;
mp.clear();
int m;
scanf("%d", &m);
for(int i = 1; i <= m; ++i)
{
int x, y, e;
scanf("%d%d%d", &x, &y, &e);
q[i] = {get(x), get(y), e};
}
for(int i = 1; i <= n; ++i) f[i] = i;
// 合并所有相等约束条件
for(int i = 1; i <= m; ++i)
{
if(q[i].e == 1)
{
int fx = find(q[i].x), fy = find(q[i].y);
f[fx] = fy;
}
}
// 检查所有不等条件
bool has_conflict = false;
for(int i = 1; i <= m; ++i)
{
if(q[i].e == 0)
{
int fx = find(q[i].x), fy = find(q[i].y);
if(fx == fy)
{
has_conflict = true;
break;
}
}
}
if(has_conflict) puts("NO");
else puts("YES");
}
return 0;
}