[NOI2015] 程式自動分析
阿新 • • 發佈:2021-10-23
一開始想種類並查集
但是\(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; }