トピックリンク:こちらをクリックしてください
タイトルデータ範囲 が、 、実際のデータのみを使用するよう 、最初の添字離散、チェックしやすいとセットバック操作。
順序は、それゆえ、その後、不均等な制約を考慮して、すべて同じ制約を考慮することができる結果に影響を及ぼさなかったとのすべての制約が矛盾しています。前者は、後者が競合していません しかし と 同じコレクションにされてきた、それは矛盾です。
#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;
}