程序自动分析
并查集+离散化
#include<bits/stdc++.h> using namespace std; void Cin(int &x) { char c=getchar();x=0; while(c>'9'||c<'0')c=getchar(); while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar(); } int n,k,T; struct bcj { int l,r,v; bool operator <(const bcj&a)const { return v>a.v; } }e[100001]; int dad[100001]; int b[200011]; int getfather(int x) { if(dad[x]==x) return x; dad[x]=getfather(dad[x]); return dad[x]; } void bf() { for(int i=1;i<=2*n;i++) dad[i]=i; for(int i=1;i<=n;i++) { if(getfather(e[i].l)!=getfather(e[i].r)&&e[i].v==1) { dad[getfather(e[i].l)]=e[i].r; } else if(getfather(e[i].l)==getfather(e[i].r)) { if(e[i].v==0) { cout<<"NO"<<endl; return; } } } cout<<"YES"<<endl; } void init() { Cin(n); for(int i=1;i<=n;i++) { Cin(e[i].l),Cin(e[i].r),Cin(e[i].v); b[i]=e[i].l; b[i+n]=e[i].r; } sort(e+1,e+n+1); sort(b+1,b+2*n+1); for(int i=1;i<=n;i++) { e[i].l=lower_bound(b+1,b+2*n+1,e[i].l)-b; e[i].r=lower_bound(b+1,b+2*n+1,e[i].r)-b; } } int main() { Cin(T); while(T--) { init(); bf(); } return 0; }