[NOI2015] 程序自动分析
一开始想种类并查集
但是\(a\neq b ,a\neq c\)不能推出\(b=c\)
也就是不具有敌人的敌人是朋友的性质
等于和不等于可以分开处理
先处理等于,并查集维护
再处理不等于,如果在一个集合就是NO
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
#define MAXN 2000005
//#define DEBUG
int N;
struct SET {
int f[MAXN],size[MAXN];
int find(int x) {
return f[x]==x ? x : f[x] = find(f[x]);
}
inline void merge(int x,int y) {
int fx = find(x), fy = find(y);
if(fx==fy) return;
if(size[fx]<size[fy]) f[fx] = fy,size[fy] += size[fx];
else f[fy] = fx,size[fx] += size[fy];
}
inline void init() {
for(int i=1;i<=N*2;++i) {
f[i] = i; size[i] = 1;
}
}
} se;
struct query {
int i,j,e;
inline bool operator < (const query& q) const {
return e > q.e;
}
} Q[MAXN];
int tot;
map <int,int> mp;
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T; cin >> T;
while(T--) {
cin >> N;
se.init();
tot = 0; mp.clear();
for(int i=1;i<=N;++i) {
cin >> Q[i].i >> Q[i].j >> Q[i].e;
if(mp[Q[i].i]==0) mp[Q[i].i] = ++tot;
if(mp[Q[i].j]==0) mp[Q[i].j] = ++tot;
Q[i].i = mp[Q[i].i]; Q[i].j = mp[Q[i].j];
}
bool flag = true;
for(int i=1;i<=N;++i) {
int x = Q[i].i; int y = Q[i].j;
if(Q[i].e==1) se.merge(x,y);
}
for(int i=1;i<=N;++i) {
int x = Q[i].i; int y = Q[i].j;
if(Q[i].e==0) {
if(se.find(x)==se.find(y)) {
flag = false; break;
}
}
}
if(flag) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}

浙公网安备 33010602011771号