1. 程式人生 > 其它 >[NOI2015] 程式自動分析

[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;
}