给定n个关系, a = b 和 a != b ,求这些关系中是否不存在矛盾
不存在: 输出YES
存在:输出NO
样例
Sample Input
2
2
1 2 1
1 2 0
2
1 2 1
2 1 1
Sample Output
NO
YES
思路
- 利用并查集维护a = b 的情况, 把相等的维护在同一个集合,如果再查询不相等的关系,如果存在有他们在同一个集合,就输出NO
- 由于数据很大,我们用到离散化
- 本题利用unordered_map进行离散化
代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <unordered_map>
using namespace std;
typedef long long ll;
struct node{
int a, b;
};
const int N = 2000010;
int f[N];
vector<node> tem;
unordered_map<ll, int> m;
int cnt;
int mapping(ll x)
{
if(m.count(x)) return m[x];
return m[x] = cnt++;
}
void init()
{
for(int i = 0; i < N; i++)
f[i] = i;
}
int find(int x)
{
if(x == f[x])
return x;
return f[x] = find(f[x]);
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
if(x == y)
return ;
f[x] = y;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
tem.clear();
init();
m.clear();
cnt = 1;
int n;
scanf("%d", &n);
bool flag = true;
for(int i = 1; i <= n; i++)
{
ll aa, bb;
int e;
scanf("%lld%lld%d", &aa, &bb, &e);
int a = mapping(aa);
int b = mapping(bb);
if(e == 1)
unite(a, b);
else
{
node t;
t.a = a;
t.b = b;
tem.push_back(t);
}
}
for(int i = 0; i < tem.size(); i++)
{
int a = tem[i].a;
int b = tem[i].b;
if(find(a) == find(b))
flag = false;
}
if(flag)
cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}