NOI2015 程序自动分析

时间:2023-03-09 18:42:07
NOI2015 程序自动分析
/*
十分简单的题面
离散化一下 然后并茶几一下就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=;char s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<=''){x=x*+s-'';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=;map<int,int>to;num=;
memset(fa,,sizeof(fa));
m=init();int x,y,z;falg=;
for(int i=;i<=m;i++)
{
x=init();y=init();z=init();
int a=to[x];if(a==){a=++n;to[x]=fa[a]=a;}
int b=to[y];if(b==){b=++n;to[y]=fa[b]=b;}
if(z)merge(to[x],to[y]);
else s[++num]=a,t[num]=b;
}
for(int i=;i<=num;i++)
{
int a=s[i];int b=t[i];
int r1=find(a);
int r2=find(b);
if(r1==r2)falg=;
}
if(falg)printf("NO\n");
else printf("YES\n");
}
return ;
}