又一次做了这道题,感慨万千。
记得寒假时,被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