Luogu P1955 [NOI2015]程序自动分析

又一次做了这道题,感慨万千。

记得寒假时,被cmd2001点起来讲这道题,胡言乱语。。受尽鄙视(现在也是好吗)。。后来下课想A掉,可是3天下来总是错。。。后来抄了分题解就咕咕了。。。

今天老师留了这道题,想起往事不堪回首。。于是决定做一下。。结果一次A了 (???)

先把所有相等条件的合并,然后拿不等条件一个个试,如果都没问题,就YES,若和之前合并的矛盾,就NO

// luogu-judger-enable-o2
#include<cstdio>
#include<iostream>
#include<map>
#define pc(x) putchar(x)
#define R register int
#define getchar() *S++
char RR[100000000],*S=RR;
using namespace std;
inline int g() {
    R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
    do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m,t,cnt,num;
int fa[200010],u[100010],v[100010];
int getf(int x) {return x==fa[x]?x:fa[x]=getf(fa[x]);}
inline void merge(int u,int v) {
    u=getf(u),v=getf(v); fa[u]=v;
}
signed main() {
    fread(RR,sizeof(RR),1,stdin);
    t=g();
    while(t--) { cnt=0,num=0; register bool flg=false;
        map<int,int> mp;
        n=g(); for(R i=1;i<=2*n;++i) fa[i]=i;
        for(R i=1;i<=n;++i){
            R uu=g(),vv=g(),k=g();
            if(mp.find(uu)==mp.end()) uu=mp[uu]=++num; else uu=mp[uu];
            if(mp.find(vv)==mp.end()) vv=mp[vv]=++num; else vv=mp[vv];
            if(k) merge(uu,vv); 
            else u[++cnt]=uu,v[cnt]=vv;
        }
        for(R i=1;i<=cnt;++i) if(getf(u[i])==getf(v[i])) {flg=true; break;}
        flg?(pc('N'),pc('O')):(pc('Y'),pc('E'),pc('S')); pc('\n');
    }
}

2019.04.16

posted @ 2019-04-16 19:16  LuitaryiJack  阅读(100)  评论(0编辑  收藏  举报