bzoj 4195 程序自动分析 Posted on 2019-09-23 | Views: 并查集. 把所有 $x_i=x_j$ 的 $(i,j)$ 用并查集合并在一起,再对于所有 $x_i\not= x_j$ 的 $(i,j)$ ,查询是否在同一个并查集中即可. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465//%std#include<bits/stdc++.h>using namespace std;typedef long long ll;inline int read(){ int out=0,fh=1; char jp=getchar(); while ((jp>'9'||jp<'0')&&jp!='-') jp=getchar(); if (jp=='-') fh=-1,jp=getchar(); while (jp>='0'&&jp<='9') out=out*10+jp-'0',jp=getchar(); return out*fh;}const int MAXN=1e6+10;struct edge{ int u,v,tp;}E[MAXN];int n,val[MAXN<<1],tot=0;int fa[MAXN];int Find(int x){ return x==fa[x]?x:fa[x]=Find(fa[x]);}bool solve(){ tot=0; n=read(); for(int i=1;i<=n;++i) { val[++tot]=E[i].u=read(); val[++tot]=E[i].v=read(); E[i].tp=read(); } sort(val+1,val+1+tot); tot=unique(val+1,val+1+tot)-val-1; for(int i=1;i<=tot;++i) fa[i]=i; for(int i=1;i<=n;++i) { E[i].u=lower_bound(val+1,val+1+tot,E[i].u)-val; E[i].v=lower_bound(val+1,val+1+tot,E[i].v)-val; if(E[i].tp && Find(E[i].u)!=Find(E[i].v)) fa[Find(E[i].u)]=Find(E[i].v); } for(int i=1;i<=n;++i) if(!E[i].tp && Find(E[i].u)==Find(E[i].v)) return false; return true;}int main(){ int T=read(); while(T--) { if(solve()) puts("YES"); else puts("NO"); } return 0;}