/* 十分简单的题面 离散化一下 然后并茶几一下就OK了 跑的死慢 可能还有更优的方法吧 */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #define maxn 1000010 using namespace std; int T,n,m,s[maxn],t[maxn],fa[maxn],falg,num; int init() { int x=0;char s=getchar(); while(s<‘0‘||s>‘9‘)s=getchar(); while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();} return x; } int find(int x) { if(x!=fa[x])fa[x]=find(fa[x]); return fa[x]; } void merge(int a,int b) { int r1=find(a); int r2=find(b); if(r1!=r2)fa[r1]=r2; } int main() { T=init(); while(T--) { n=0;map<int,int>to;num=0; memset(fa,0,sizeof(fa)); m=init();int x,y,z;falg=0; for(int i=1;i<=m;i++) { x=init();y=init();z=init(); int a=to[x];if(a==0){a=++n;to[x]=fa[a]=a;} int b=to[y];if(b==0){b=++n;to[y]=fa[b]=b;} if(z)merge(to[x],to[y]); else s[++num]=a,t[num]=b; } for(int i=1;i<=num;i++) { int a=s[i];int b=t[i]; int r1=find(a); int r2=find(b); if(r1==r2)falg=1; } if(falg)printf("NO\n"); else printf("YES\n"); } return 0; }
时间: 2024-10-22 16:03:38